Skip to content

Commit

Permalink
added test and example app for AirQuality/environment sensors
Browse files Browse the repository at this point in the history
  • Loading branch information
Katalystical committed Mar 26, 2023
1 parent a845b64 commit 533691d
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 0 deletions.
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);
}
}
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);
}


}

0 comments on commit 533691d

Please sign in to comment.