-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #75 from Katalystical/feature/airquality
- Loading branch information
Showing
9 changed files
with
247 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
24 changes: 24 additions & 0 deletions
24
...t-api/src/main/java/de/dvdgeisler/iot/dirigera/client/api/EnvironmentSensorDeviceApi.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package de.dvdgeisler.iot.dirigera.client.api; | ||
|
||
import de.dvdgeisler.iot.dirigera.client.api.http.ClientApi; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.Device; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor.EnvironmentSensorAttributes; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor.EnvironmentSensorConfigurationAttributes; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor.EnvironmentSensorDevice; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor.EnvironmentSensorStateAttributes; | ||
|
||
public class EnvironmentSensorDeviceApi extends ControllerDeviceApi< | ||
EnvironmentSensorStateAttributes, | ||
EnvironmentSensorAttributes, | ||
EnvironmentSensorConfigurationAttributes, | ||
EnvironmentSensorDevice> { | ||
|
||
public EnvironmentSensorDeviceApi(final ClientApi clientApi, final WebSocketApi webSocketApi) { | ||
super(clientApi, webSocketApi); | ||
} | ||
|
||
@Override | ||
protected boolean isInstance(final Device<?, ?> device) { | ||
return super.isInstance(device) && device instanceof EnvironmentSensorDevice; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
...r/iot/dirigera/client/api/model/device/environmentsensor/EnvironmentSensorAttributes.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor; | ||
|
||
import com.fasterxml.jackson.annotation.JsonUnwrapped; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.DeviceAttributes; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.ota.OtaAttributes; | ||
|
||
public class EnvironmentSensorAttributes extends DeviceAttributes<EnvironmentSensorStateAttributes> { | ||
public String productCode; | ||
public Boolean permittingJoin; | ||
public Integer currentTemperature; | ||
public Integer currentRH; | ||
public Integer currentPM25; | ||
public Integer maxMeasuredPM25; | ||
public Integer minMeasuredPM25; | ||
public Integer vocIndex; | ||
|
||
@JsonUnwrapped | ||
public OtaAttributes ota; | ||
|
||
public EnvironmentSensorAttributes() { | ||
} | ||
|
||
public EnvironmentSensorAttributes( | ||
final String model, | ||
final String manufacturer, | ||
final String firmwareVersion, | ||
final String hardwareVersion, | ||
final String serialNumber, | ||
final String productCode, | ||
final Boolean permittingJoin, | ||
final EnvironmentSensorStateAttributes state, | ||
final OtaAttributes ota) { | ||
super(model, manufacturer, firmwareVersion, hardwareVersion, serialNumber, state); | ||
this.productCode = productCode; | ||
this.permittingJoin = permittingJoin; | ||
this.ota = ota; | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
...a/client/api/model/device/environmentsensor/EnvironmentSensorConfigurationAttributes.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor; | ||
|
||
import de.dvdgeisler.iot.dirigera.client.api.model.device.DeviceConfigurationDefaultAttributes; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.deviceset.DeviceSet; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.deviceset.Room; | ||
|
||
import java.util.List; | ||
|
||
public class EnvironmentSensorConfigurationAttributes extends DeviceConfigurationDefaultAttributes { | ||
|
||
public EnvironmentSensorConfigurationAttributes(final String customIcon, final List<DeviceSet> deviceSet, final Boolean isHidden, final Room room) { | ||
super(customIcon, deviceSet, isHidden, room); | ||
} | ||
|
||
public EnvironmentSensorConfigurationAttributes() { | ||
} | ||
} |
29 changes: 29 additions & 0 deletions
29
...isler/iot/dirigera/client/api/model/device/environmentsensor/EnvironmentSensorDevice.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor; | ||
|
||
import de.dvdgeisler.iot.dirigera.client.api.model.device.Device; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.DeviceCapabilities; | ||
|
||
import java.time.LocalDateTime; | ||
import java.util.List; | ||
|
||
import static de.dvdgeisler.iot.dirigera.client.api.model.device.DeviceCategory.SENSOR; | ||
import static de.dvdgeisler.iot.dirigera.client.api.model.device.DeviceType.ENVIRONMENT_SENSOR; | ||
|
||
public class EnvironmentSensorDevice extends Device<EnvironmentSensorAttributes, EnvironmentSensorConfigurationAttributes> { | ||
|
||
public EnvironmentSensorDevice() { | ||
} | ||
|
||
public EnvironmentSensorDevice( | ||
final String id, | ||
final LocalDateTime createdAt, | ||
final Boolean isReachable, | ||
final LocalDateTime lastSeen, | ||
final EnvironmentSensorAttributes attributes, | ||
final DeviceCapabilities capabilities, | ||
final List<String> remoteLinks, | ||
final EnvironmentSensorConfigurationAttributes environmentSensorConfigurationAttributes | ||
) { | ||
super(id, SENSOR, ENVIRONMENT_SENSOR, createdAt, isReachable, lastSeen, attributes, capabilities, remoteLinks, environmentSensorConfigurationAttributes); | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
.../dirigera/client/api/model/device/environmentsensor/EnvironmentSensorStateAttributes.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor; | ||
|
||
import de.dvdgeisler.iot.dirigera.client.api.model.device.DeviceStateAttributes; | ||
|
||
public class EnvironmentSensorStateAttributes extends DeviceStateAttributes { | ||
|
||
public EnvironmentSensorStateAttributes(final String customName) { | ||
super(customName); | ||
} | ||
|
||
public EnvironmentSensorStateAttributes() { | ||
} | ||
} |
65 changes: 65 additions & 0 deletions
65
...er/iot/dirigera/client/api/model/device/environmentsensor/VINDSTYRKAAirQualitySensor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
package de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor; | ||
|
||
import de.dvdgeisler.iot.dirigera.client.api.model.device.Device; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.DeviceTest; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertTrue; | ||
|
||
class VINDSTYRKAAirQualitySensor extends DeviceTest { | ||
final static String JSON = """ | ||
{ | ||
"id" : "XXXXXXXXXXXXXXXXXXX", | ||
"type" : "sensor", | ||
"deviceType" : "environmentSensor", | ||
"createdAt" : "2023-03-10T13:23:42.000Z", | ||
"isReachable" : true, | ||
"lastSeen" : "2023-03-26T14:10:16.000Z", | ||
"attributes" : { | ||
"customName" : "Luftsensor", | ||
"firmwareVersion" : "1.0.11", | ||
"hardwareVersion" : "1", | ||
"manufacturer" : "IKEA of Sweden", | ||
"model" : "VINDSTYRKA", | ||
"productCode" : "E2112", | ||
"serialNumber" : "XXXXXXXXXXXX", | ||
"currentTemperature" : 19, | ||
"currentRH" : 52, | ||
"currentPM25" : 2, | ||
"maxMeasuredPM25" : 999, | ||
"minMeasuredPM25" : 0, | ||
"vocIndex" : 112, | ||
"identifyPeriod" : 0, | ||
"identifyStarted" : "2000-01-01T00:00:00.000Z", | ||
"permittingJoin" : false, | ||
"otaPolicy" : "autoUpdate", | ||
"otaProgress" : 0, | ||
"otaScheduleEnd" : "00:00", | ||
"otaScheduleStart" : "00:00", | ||
"otaState" : "readyToCheck", | ||
"otaStatus" : "upToDate" | ||
}, | ||
"capabilities" : { | ||
"canSend" : [ ], | ||
"canReceive" : [ "customName" ] | ||
}, | ||
"room" : { | ||
"id" : "255c7093-f8bc-4ea6-aa32-e352f673b716", | ||
"name" : "Schlafzimmer ", | ||
"color" : "ikea_yellow_no_24", | ||
"icon" : "rooms_bed" | ||
}, | ||
"deviceSet" : [ ], | ||
"remoteLinks" : [ ], | ||
"isHidden" : false | ||
} | ||
"""; | ||
|
||
public VINDSTYRKAAirQualitySensor() { | ||
super(JSON); | ||
} | ||
|
||
@Override | ||
public void validateDeserialize(final Device<?,?> device) { | ||
assertTrue(device instanceof EnvironmentSensorDevice); | ||
} | ||
} |
55 changes: 55 additions & 0 deletions
55
...rc/main/java/de/dvdgeisler/iot/dirigera/client/examples/airquality/AirQualityMonitor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
package de.dvdgeisler.iot.dirigera.client.examples.airquality; | ||
|
||
import de.dvdgeisler.iot.dirigera.client.api.DirigeraApi; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.DeviceType; | ||
import de.dvdgeisler.iot.dirigera.client.api.model.device.environmentsensor.EnvironmentSensorDevice; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import org.springframework.boot.SpringApplication; | ||
import org.springframework.boot.autoconfigure.SpringBootApplication; | ||
import org.springframework.context.annotation.ComponentScan; | ||
import org.springframework.scheduling.annotation.EnableScheduling; | ||
import org.springframework.scheduling.annotation.Scheduled; | ||
import reactor.core.publisher.Flux; | ||
|
||
/** | ||
* Monitor air quality | ||
*/ | ||
@SpringBootApplication | ||
@ComponentScan(basePackageClasses = {DirigeraApi.class}) | ||
@EnableScheduling | ||
public class AirQualityMonitor { | ||
private final static Logger log = LoggerFactory.getLogger(AirQualityMonitor.class); | ||
|
||
private final DirigeraApi api; | ||
|
||
public AirQualityMonitor(final DirigeraApi api) { | ||
this.api = api; | ||
} | ||
|
||
@Scheduled(fixedRate = 1000) | ||
public void monitor() { | ||
this.api.device.environmentSensor.all() | ||
.flatMapMany(Flux::fromIterable) | ||
.filter(d -> d.deviceType == DeviceType.ENVIRONMENT_SENSOR) | ||
.cast(EnvironmentSensorDevice.class) | ||
.doOnNext(this::printAirQualityData) | ||
.blockLast(); | ||
} | ||
|
||
private void printAirQualityData(final EnvironmentSensorDevice sensor) { | ||
log.info("{}: Temperature={}, RelativeHumidity={}, PM25={}, VOC={}, isReachable={}", | ||
sensor.attributes.state.customName != null && !sensor.attributes.state.customName.isBlank() ? sensor.attributes.state.customName : sensor.id, | ||
sensor.attributes.currentTemperature, | ||
sensor.attributes.currentRH, | ||
sensor.attributes.currentPM25, | ||
sensor.attributes.vocIndex, | ||
sensor.isReachable); | ||
} | ||
|
||
public static void main(String[] args) { | ||
SpringApplication.run(AirQualityMonitor.class, args); | ||
} | ||
|
||
|
||
} |