package ch.usi.inf.sa4.sanmarinoes.smarthut.service; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Sensor; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.Thermostat; import ch.usi.inf.sa4.sanmarinoes.smarthut.models.ThermostatRepository; import ch.usi.inf.sa4.sanmarinoes.smarthut.socket.SensorSocketEndpoint; import ch.usi.inf.sa4.sanmarinoes.smarthut.utils.Utils; import java.math.BigDecimal; import java.util.List; import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class ThermostatService { @Autowired private SensorSocketEndpoint endpoint; @Autowired private DevicePropagationService deviceService; @Autowired private ThermostatRepository thermostatRepository; private void randomJitter(Thermostat thermostat) { updateValueForThermostat( thermostat, Sensor.TYPICAL_VALUES .get(Sensor.SensorType.TEMPERATURE) .multiply(BigDecimal.valueOf(0.975 + Math.random() / 20))); } private void updateValueForThermostat(Thermostat thermostat, BigDecimal value) { thermostat.setInternalSensorTemperature(value); deviceService.saveAsOwner( thermostat, thermostatRepository.findUser(thermostat.getId()).getUsername()); } public void fakeUpdateAll() { thermostatRepository.findAll().forEach(this::randomJitter); updateStates(); } public List findAll(String username) { Iterable all = thermostatRepository.findAllByUsername(username); all.forEach(this::populateMeasuredTemperature); return Utils.toList(all); } public void computeState(Thermostat t) { populateMeasuredTemperature(t); t.computeState(); } private void updateState(Thermostat t) { this.computeState(t); deviceService.saveAsOwner(t, thermostatRepository.findUser(t.getId()).getUsername()); endpoint.queueDeviceUpdate(t, thermostatRepository.findUser(t.getId()), false, null, false); } public void updateStates() { Iterable ts = thermostatRepository.findAll(); ts.forEach(this::updateState); } public Optional findById(Long thermostat, String username) { Optional t = thermostatRepository.findByIdAndUsername(thermostat, username); if (t.isPresent()) { Thermostat u = t.get(); populateMeasuredTemperature(u); t = Optional.of(u); } return t; } private BigDecimal measureTemperature(final Thermostat thermostat) { Optional average; if (thermostat.isUseExternalSensors()) { average = thermostatRepository.getAverageTemperature(thermostat.getRoomId()); } else { return thermostat.getInternalSensorTemperature(); } return average.orElse(null); } public void populateMeasuredTemperature(Thermostat thermostat) { thermostat.setMeasuredTemperature(measureTemperature(thermostat)); } }