diff --git a/bundles/org.openhab.binding.luftdateninfo/README.md b/bundles/org.openhab.binding.luftdateninfo/README.md
index 4b100712a32c4..ff076ced1d5d4 100644
--- a/bundles/org.openhab.binding.luftdateninfo/README.md
+++ b/bundles/org.openhab.binding.luftdateninfo/README.md
@@ -1,7 +1,5 @@
# LuftdatenInfo Binding
-
-
Binding for the Sensor Community [luftdaten.info](https://luftdaten.info/). The community provides instructions to build sensors on your own and they can be integrated into the database.
With this binding you can integrate your sensor, a sensor nearby or even any sensors you want into openHAB.
@@ -21,10 +19,21 @@ There's no auto discovery. See Thing configuration how to setup a Sensor.
## Thing Configuration
+Choose either a local IP address of your personal owned sensor _or_ a sensor id of an external one.
+
| Parameter | Description |
|-----------------|----------------------------------------------------------------------|
+| ipAddress | Local IP address of your personal owned sensor |
| sensorid | Sensor ID obtained from https://deutschland.maps.sensor.community/ |
+### Local Sensor
+
+Please check in your browser if you can access your sensor with your local IP address.
+
+![Luftdaten.info Logo](doc/local-sensor.png)
+
+### External Sensor
+
Perform the following steps to get the appropriate Sensor ID
* Go to to [luftdaten.info map](https://deutschland.maps.sensor.community/)
@@ -69,9 +78,9 @@ Perform the following steps to get the appropriate Sensor ID
luftdaten.things
```
-Thing luftdateninfo:particulate:pm_sensor "PM Sensor" [ sensorid=28842]
-Thing luftdateninfo:conditions:cond_sensor "Condition Sensor" [ sensorid=28843]
-Thing luftdateninfo:noise:noise_sensor "Noise Sensor" [ sensorid=39745]
+Thing luftdateninfo:particulate:pm_sensor "PM Sensor" [ ipAddress=192.168.178.50 ]
+Thing luftdateninfo:conditions:cond_sensor "Condition Sensor" [ sensorid=28843 ]
+Thing luftdateninfo:noise:noise_sensor "Noise Sensor" [ sensorid=39745 ]
```
### Items
diff --git a/bundles/org.openhab.binding.luftdateninfo/doc/local-sensor.png b/bundles/org.openhab.binding.luftdateninfo/doc/local-sensor.png
new file mode 100644
index 0000000000000..ccf4e6f1fd282
Binary files /dev/null and b/bundles/org.openhab.binding.luftdateninfo/doc/local-sensor.png differ
diff --git a/bundles/org.openhab.binding.luftdateninfo/doc/logo-rund.png b/bundles/org.openhab.binding.luftdateninfo/doc/logo-rund.png
deleted file mode 100644
index 962c7a9723c03..0000000000000
Binary files a/bundles/org.openhab.binding.luftdateninfo/doc/logo-rund.png and /dev/null differ
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/LuftdatenInfoConfiguration.java b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/LuftdatenInfoConfiguration.java
index 5fb55a0163ce8..18a6597a1a9f2 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/LuftdatenInfoConfiguration.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/LuftdatenInfoConfiguration.java
@@ -13,6 +13,7 @@
package org.openhab.binding.luftdateninfo.internal;
import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.openhab.binding.luftdateninfo.internal.utils.Constants;
/**
* The {@link LuftdatenInfoConfiguration} class contains fields mapping thing configuration parameters.
@@ -22,5 +23,7 @@
@NonNullByDefault
public class LuftdatenInfoConfiguration {
- public int sensorid = -1;
+ public int sensorid = Constants.UNDEF;
+
+ public String ipAddress = Constants.EMPTY;
}
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/LuftdatenInfoHandlerFactory.java b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/LuftdatenInfoHandlerFactory.java
index 5f7641eb3b19d..51b653a1f6eac 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/LuftdatenInfoHandlerFactory.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/LuftdatenInfoHandlerFactory.java
@@ -48,13 +48,9 @@ public LuftdatenInfoHandlerFactory(final @Reference HttpClientFactory httpClient
@Override
public boolean supportsThingType(ThingTypeUID thingTypeUID) {
- if (thingTypeUID.equals(LuftdatenInfoBindingConstants.THING_TYPE_PARTICULATE)
+ return (thingTypeUID.equals(LuftdatenInfoBindingConstants.THING_TYPE_PARTICULATE)
|| thingTypeUID.equals(LuftdatenInfoBindingConstants.THING_TYPE_CONDITIONS)
- || thingTypeUID.equals(LuftdatenInfoBindingConstants.THING_TYPE_NOISE)) {
- return true;
- } else {
- return false;
- }
+ || thingTypeUID.equals(LuftdatenInfoBindingConstants.THING_TYPE_NOISE));
}
@Override
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/BaseSensorHandler.java b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/BaseSensorHandler.java
index 97e7890f53bb4..57eb3d0c44348 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/BaseSensorHandler.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/BaseSensorHandler.java
@@ -13,12 +13,14 @@
package org.openhab.binding.luftdateninfo.internal.handler;
import java.time.LocalDateTime;
+import java.util.Optional;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.luftdateninfo.internal.LuftdatenInfoConfiguration;
+import org.openhab.binding.luftdateninfo.internal.utils.Constants;
import org.openhab.binding.luftdateninfo.internal.utils.DateTimeUtils;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.thing.Thing;
@@ -48,9 +50,12 @@ public abstract class BaseSensorHandler extends BaseThingHandler {
protected ThingStatus myThingStatus = ThingStatus.UNKNOWN;
protected UpdateStatus lastUpdateStatus = UpdateStatus.UNKNOWN;
protected @Nullable ScheduledFuture> refreshJob;
+ private Optional sensorUrl = Optional.empty();
+ private boolean firstUpdate = true;
public enum ConfigStatus {
- OK,
+ INTERNAL_SENSOR_OK,
+ EXTERNAL_SENSOR_OK,
IS_NULL,
SENSOR_IS_NULL,
SENSOR_ID_NEGATIVE,
@@ -88,6 +93,7 @@ public void handleCommand(ChannelUID channelUID, Command command) {
@Override
public void initialize() {
+ firstUpdate = true;
lifecycleStatus = LifecycleStatus.INITIALIZING;
scheduler.execute(this::startUp);
}
@@ -95,7 +101,7 @@ public void initialize() {
private void startUp() {
config = getConfigAs(LuftdatenInfoConfiguration.class);
configStatus = checkConfig(config);
- if (configStatus == ConfigStatus.OK) {
+ if (configStatus == ConfigStatus.INTERNAL_SENSOR_OK || configStatus == ConfigStatus.EXTERNAL_SENSOR_OK) {
// start getting values
dataUpdate();
} else {
@@ -135,10 +141,16 @@ public void dispose() {
*/
private ConfigStatus checkConfig(@Nullable LuftdatenInfoConfiguration c) {
if (c != null) {
- if (c.sensorid >= 0) {
- return ConfigStatus.OK;
+ if (c.ipAddress != null && !Constants.EMPTY.equals(c.ipAddress)) {
+ sensorUrl = Optional.of("http://" + c.ipAddress + "/data.json");
+ return ConfigStatus.INTERNAL_SENSOR_OK;
} else {
- return ConfigStatus.SENSOR_ID_NEGATIVE;
+ if (c.sensorid >= 0) {
+ sensorUrl = Optional.of("http://data.sensor.community/airrohr/v1/sensor/" + c.sensorid + "/");
+ return ConfigStatus.EXTERNAL_SENSOR_OK;
+ } else {
+ return ConfigStatus.SENSOR_ID_NEGATIVE;
+ }
}
} else {
return ConfigStatus.IS_NULL;
@@ -150,11 +162,21 @@ public LifecycleStatus getLifecycleStatus() {
}
protected void dataUpdate() {
- HTTPHandler.getHandler().request(config.sensorid, this);
+ if (sensorUrl.isPresent()) {
+ HTTPHandler.getHandler().request(sensorUrl.get(), this);
+ }
}
public void onResponse(String data) {
- lastUpdateStatus = updateChannels(data);
+ if (firstUpdate) {
+ logger.debug("{} delivers {}", sensorUrl.get(), data);
+ firstUpdate = false;
+ }
+ if (configStatus == ConfigStatus.INTERNAL_SENSOR_OK) {
+ lastUpdateStatus = updateChannels("[" + data + "]");
+ } else {
+ lastUpdateStatus = updateChannels(data);
+ }
statusUpdate(lastUpdateStatus, EMPTY);
}
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/ConditionHandler.java b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/ConditionHandler.java
index a80ec1f03eec9..d3417f1a1be27 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/ConditionHandler.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/ConditionHandler.java
@@ -13,7 +13,8 @@
package org.openhab.binding.luftdateninfo.internal.handler;
import static org.openhab.binding.luftdateninfo.internal.LuftdatenInfoBindingConstants.*;
-import static org.openhab.binding.luftdateninfo.internal.handler.HTTPHandler.*;
+import static org.openhab.binding.luftdateninfo.internal.utils.Constants.*;
+import static org.openhab.core.library.unit.MetricPrefix.HECTO;
import java.util.List;
@@ -38,11 +39,10 @@
*/
@NonNullByDefault
public class ConditionHandler extends BaseSensorHandler {
-
protected QuantityType temperatureCache = QuantityType.valueOf(-1, SIUnits.CELSIUS);
protected QuantityType humidityCache = QuantityType.valueOf(-1, Units.PERCENT);
- protected QuantityType pressureCache = QuantityType.valueOf(-1, SIUnits.PASCAL);
- protected QuantityType pressureSeaCache = QuantityType.valueOf(-1, SIUnits.PASCAL);
+ protected QuantityType pressureCache = QuantityType.valueOf(-1, HECTO(SIUnits.PASCAL));
+ protected QuantityType pressureSeaCache = QuantityType.valueOf(-1, HECTO(SIUnits.PASCAL));
public ConditionHandler(Thing thing) {
super(thing);
@@ -55,18 +55,22 @@ public UpdateStatus updateChannels(@Nullable String json) {
if (valueList != null) {
if (HTTPHandler.getHandler().isCondition(valueList)) {
valueList.forEach(v -> {
- if (v.getValueType().equals(TEMPERATURE)) {
+ if (v.getValueType().endsWith(TEMPERATURE)) {
temperatureCache = QuantityType.valueOf(NumberUtils.round(v.getValue(), 1),
SIUnits.CELSIUS);
updateState(TEMPERATURE_CHANNEL, temperatureCache);
- } else if (v.getValueType().equals(HUMIDITY)) {
+ } else if (v.getValueType().endsWith(HUMIDITY)) {
humidityCache = QuantityType.valueOf(NumberUtils.round(v.getValue(), 1), Units.PERCENT);
updateState(HUMIDITY_CHANNEL, humidityCache);
- } else if (v.getValueType().equals(PRESSURE)) {
- pressureCache = QuantityType.valueOf(NumberUtils.round(v.getValue(), 1), SIUnits.PASCAL);
+ } else if (v.getValueType().endsWith(PRESSURE)) {
+ pressureCache = QuantityType.valueOf(
+ NumberUtils.round(NumberUtils.convert(v.getValue()) / 100, 1),
+ HECTO(SIUnits.PASCAL));
updateState(PRESSURE_CHANNEL, pressureCache);
- } else if (v.getValueType().equals(PRESSURE_SEALEVEL)) {
- pressureSeaCache = QuantityType.valueOf(NumberUtils.round(v.getValue(), 1), SIUnits.PASCAL);
+ } else if (v.getValueType().endsWith(PRESSURE_SEALEVEL)) {
+ pressureSeaCache = QuantityType.valueOf(
+ NumberUtils.round(NumberUtils.convert(v.getValue()) / 100, 1),
+ HECTO(SIUnits.PASCAL));
updateState(PRESSURE_SEA_CHANNEL, pressureSeaCache);
}
});
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/HTTPHandler.java b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/HTTPHandler.java
index ec47aa212d63d..050b69c3d8043 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/HTTPHandler.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/HTTPHandler.java
@@ -12,6 +12,8 @@
*/
package org.openhab.binding.luftdateninfo.internal.handler;
+import static org.openhab.binding.luftdateninfo.internal.utils.Constants.*;
+
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@@ -42,19 +44,6 @@ public class HTTPHandler {
private static final Gson GSON = new Gson();
private static final HTTPHandler HTTP_HANDLER = new HTTPHandler();
- public static final String P1 = "P1";
- public static final String P2 = "P2";
-
- public static final String TEMPERATURE = "temperature";
- public static final String HUMIDITY = "humidity";
- public static final String PRESSURE = "pressure";
- public static final String PRESSURE_SEALEVEL = "pressure_at_sealevel";
-
- public static final String NOISE_EQ = "noise_LAeq";
- public static final String NOISE_MIN = "noise_LA_min";
- public static final String NOISE_MAX = "noise_LA_max";
-
- private static String sensorUrl = "http://data.sensor.community/airrohr/v1/sensor/";
private static @Nullable HttpClient commonHttpClient;
public static void init(HttpClient httpClient) {
@@ -65,12 +54,11 @@ public static HTTPHandler getHandler() {
return HTTP_HANDLER;
}
- public synchronized void request(int sensorId, BaseSensorHandler callback) {
+ public synchronized void request(String url, BaseSensorHandler callback) {
HttpClient localClient = commonHttpClient;
if (localClient == null) {
logger.warn("HTTP Client not initialized");
} else {
- String url = sensorUrl + sensorId + "/";
Request req = localClient.newRequest(url);
req.timeout(15, TimeUnit.SECONDS).send(new BufferingResponseListener() {
@NonNullByDefault({})
@@ -142,7 +130,7 @@ public boolean isParticulate(@Nullable List valueList) {
if (valueList == null) {
return false;
}
- return valueList.stream().map(v -> v.getValueType()).filter(t -> t.equals(P1) || t.equals(P2)).findAny()
+ return valueList.stream().map(v -> v.getValueType()).filter(t -> t.endsWith(P1) || t.endsWith(P2)).findAny()
.isPresent();
}
@@ -150,9 +138,8 @@ public boolean isCondition(@Nullable List valueList) {
if (valueList == null) {
return false;
}
- return valueList.stream().map(v -> v.getValueType()).filter(
- t -> t.equals(TEMPERATURE) || t.equals(HUMIDITY) || t.equals(PRESSURE) || t.equals(PRESSURE_SEALEVEL))
- .findAny().isPresent();
+ return valueList.stream().map(v -> v.getValueType()).filter(t -> t.equals(TEMPERATURE) || t.endsWith(HUMIDITY)
+ || t.endsWith(PRESSURE) || t.endsWith(PRESSURE_SEALEVEL)).findAny().isPresent();
}
public boolean isNoise(@Nullable List valueList) {
@@ -160,6 +147,7 @@ public boolean isNoise(@Nullable List valueList) {
return false;
}
return valueList.stream().map(v -> v.getValueType())
- .filter(t -> t.equals(NOISE_EQ) || t.equals(NOISE_MAX) || t.equals(NOISE_MIN)).findAny().isPresent();
+ .filter(t -> t.endsWith(NOISE_EQ) || t.endsWith(NOISE_MAX) || t.endsWith(NOISE_MIN)).findAny()
+ .isPresent();
}
}
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/NoiseHandler.java b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/NoiseHandler.java
index 130bc0b852833..9a984bed8ddce 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/NoiseHandler.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/NoiseHandler.java
@@ -13,7 +13,7 @@
package org.openhab.binding.luftdateninfo.internal.handler;
import static org.openhab.binding.luftdateninfo.internal.LuftdatenInfoBindingConstants.*;
-import static org.openhab.binding.luftdateninfo.internal.handler.HTTPHandler.*;
+import static org.openhab.binding.luftdateninfo.internal.utils.Constants.*;
import java.util.List;
@@ -50,13 +50,13 @@ public UpdateStatus updateChannels(@Nullable String json) {
if (valueList != null) {
if (HTTPHandler.getHandler().isNoise(valueList)) {
valueList.forEach(v -> {
- if (v.getValueType().equals(NOISE_EQ)) {
+ if (v.getValueType().endsWith(NOISE_EQ)) {
noiseEQCache = QuantityType.valueOf(NumberUtils.round(v.getValue(), 1), Units.DECIBEL);
updateState(NOISE_EQ_CHANNEL, noiseEQCache);
- } else if (v.getValueType().equals(NOISE_MIN)) {
+ } else if (v.getValueType().endsWith(NOISE_MIN)) {
noiseMinCache = QuantityType.valueOf(NumberUtils.round(v.getValue(), 1), Units.DECIBEL);
updateState(NOISE_MIN_CHANNEL, noiseMinCache);
- } else if (v.getValueType().equals(NOISE_MAX)) {
+ } else if (v.getValueType().endsWith(NOISE_MAX)) {
noiseMaxCache = QuantityType.valueOf(NumberUtils.round(v.getValue(), 1), Units.DECIBEL);
updateState(NOISE_MAX_CHANNEL, noiseMaxCache);
}
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/PMHandler.java b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/PMHandler.java
index 55dcfb16e15d1..7ddd4e43ab882 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/PMHandler.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/handler/PMHandler.java
@@ -13,7 +13,7 @@
package org.openhab.binding.luftdateninfo.internal.handler;
import static org.openhab.binding.luftdateninfo.internal.LuftdatenInfoBindingConstants.*;
-import static org.openhab.binding.luftdateninfo.internal.handler.HTTPHandler.*;
+import static org.openhab.binding.luftdateninfo.internal.utils.Constants.*;
import java.util.List;
@@ -49,11 +49,11 @@ public UpdateStatus updateChannels(@Nullable String json) {
if (valueList != null) {
if (HTTPHandler.getHandler().isParticulate(valueList)) {
valueList.forEach(v -> {
- if (v.getValueType().equals(P1)) {
+ if (v.getValueType().endsWith(P1)) {
pm100Cache = QuantityType.valueOf(NumberUtils.round(v.getValue(), 1),
Units.MICROGRAM_PER_CUBICMETRE);
updateState(PM100_CHANNEL, pm100Cache);
- } else if (v.getValueType().equals(P2)) {
+ } else if (v.getValueType().endsWith(P2)) {
pm25Cache = QuantityType.valueOf(NumberUtils.round(v.getValue(), 1),
Units.MICROGRAM_PER_CUBICMETRE);
updateState(PM25_CHANNEL, pm25Cache);
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/utils/Constants.java b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/utils/Constants.java
new file mode 100644
index 0000000000000..18b1e775404b3
--- /dev/null
+++ b/bundles/org.openhab.binding.luftdateninfo/src/main/java/org/openhab/binding/luftdateninfo/internal/utils/Constants.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2010-2021 Contributors to the openHAB project
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.openhab.binding.luftdateninfo.internal.utils;
+
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
+/**
+ * The {@link Constants} Constants used in this binding
+ *
+ * @author Bernd Weymann - Initial contribution
+ */
+@NonNullByDefault
+public class Constants {
+ public static final String EMPTY = "";
+ public static final String P1 = "P1";
+ public static final String P2 = "P2";
+
+ public static final String TEMPERATURE = "temperature";
+ public static final String HUMIDITY = "humidity";
+ public static final String PRESSURE = "pressure";
+ public static final String PRESSURE_SEALEVEL = "pressure_at_sealevel";
+
+ public static final String NOISE_EQ = "noise_LAeq";
+ public static final String NOISE_MIN = "noise_LA_min";
+ public static final String NOISE_MAX = "noise_LA_max";
+ public static final int UNDEF = -1;
+}
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.luftdateninfo/src/main/resources/OH-INF/thing/thing-types.xml
index abe42dc4b202d..001a2c1cb93f8 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/main/resources/OH-INF/thing/thing-types.xml
+++ b/bundles/org.openhab.binding.luftdateninfo/src/main/resources/OH-INF/thing/thing-types.xml
@@ -14,9 +14,14 @@
-
-
- Sensor ID
+
+ network-address
+
+ Local IP address of your personal owned sensor
+
+
+
+ Sensor ID from https://deutschland.maps.sensor.community/
@@ -33,9 +38,14 @@
-
-
- Sensor ID
+
+ network-address
+
+ Local IP address of your personal owned sensor
+
+
+
+ Sensor ID from https://deutschland.maps.sensor.community/
@@ -51,9 +61,14 @@
-
-
- Sensor ID
+
+ network-address
+
+ Local IP address of your personal owned sensor
+
+
+
+ Sensor ID from https://deutschland.maps.sensor.community/
@@ -61,44 +76,53 @@
Number:Density
+
Number:Density
+
Number:Temperature
Temperature from the selected Sensor ID
+
Number:Dimensionless
Humidity from the selected Sensor ID
+
Number:Pressure
Atmospheric Pressure from the selected Sensor ID
+
Number:Pressure
Atmospheric Pressure at sea level from the selected Sensor ID
+
Number:Dimensionless
Average noise level from the selected Sensor ID
+
Number:Dimensionless
Minimum noise level (last 2.5 minutes) from the selected Sensor ID
+
Number:Dimensionless
Maximum noise level (last 2.5 minutes) from the selected Sensor ID
+
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/ConditionHandlerTest.java b/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/ConditionHandlerTest.java
index 97eb43a5612b7..bf04225f28556 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/ConditionHandlerTest.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/ConditionHandlerTest.java
@@ -13,6 +13,7 @@
package org.openhab.binding.luftdateninfo.internal;
import static org.junit.jupiter.api.Assertions.*;
+import static org.openhab.core.library.unit.MetricPrefix.HECTO;
import java.util.HashMap;
@@ -49,9 +50,9 @@ public void testValidNoPressureUpdate() {
UpdateStatus result = condHandler.updateChannels(pmJson);
assertEquals(UpdateStatus.OK, result, "Valid update");
assertEquals(QuantityType.valueOf(22.7, SIUnits.CELSIUS), condHandler.getTemperature(), "Temperature");
- assertEquals(QuantityType.valueOf(61.0, Units.PERCENT), condHandler.getHumidity(), "Humidity");
- assertEquals(QuantityType.valueOf(-1, SIUnits.PASCAL), condHandler.getPressure(), "Pressure");
- assertEquals(QuantityType.valueOf(-1, SIUnits.PASCAL), condHandler.getPressureSea(), "Pressure Sea");
+ assertEquals(QuantityType.valueOf(61., Units.PERCENT), condHandler.getHumidity(), "Humidity");
+ assertEquals(QuantityType.valueOf(-1, HECTO(SIUnits.PASCAL)), condHandler.getPressure(), "Pressure");
+ assertEquals(QuantityType.valueOf(-1, HECTO(SIUnits.PASCAL)), condHandler.getPressureSea(), "Pressure Sea");
} else {
assertTrue(false);
}
@@ -73,8 +74,9 @@ public void testValidWithPressureUpdate() {
assertEquals(UpdateStatus.OK, result, "Valid update");
assertEquals(QuantityType.valueOf(21.5, SIUnits.CELSIUS), condHandler.getTemperature(), "Temperature");
assertEquals(QuantityType.valueOf(58.5, Units.PERCENT), condHandler.getHumidity(), "Humidity");
- assertEquals(QuantityType.valueOf(100200.0, SIUnits.PASCAL), condHandler.getPressure(), "Pressure");
- assertEquals(QuantityType.valueOf(101968.7, SIUnits.PASCAL), condHandler.getPressureSea(), "Pressure Sea");
+ assertEquals(QuantityType.valueOf(1002.0, HECTO(SIUnits.PASCAL)), condHandler.getPressure(), "Pressure");
+ assertEquals(QuantityType.valueOf(1019.7, HECTO(SIUnits.PASCAL)), condHandler.getPressureSea(),
+ "Pressure Sea");
} else {
assertTrue(false);
}
@@ -126,4 +128,27 @@ public void testNullUpdate() {
UpdateStatus result = condHandler.updateChannels(null);
assertEquals(UpdateStatus.CONNECTION_ERROR, result, "Valid update");
}
+
+ @Test
+ public void testInternalUpdate() {
+ ThingMock t = new ThingMock();
+
+ HashMap properties = new HashMap();
+ // String sensorid taken from thing-types.xml
+ properties.put("ipAddress", "192.168.178.1");
+ t.setConfiguration(properties);
+
+ ConditionHandlerExtension condHandler = new ConditionHandlerExtension(t);
+ String pmJson = FileReader.readFileInString("src/test/resources/internal-data.json");
+ if (pmJson != null) {
+ UpdateStatus result = condHandler.updateChannels("[" + pmJson + "]");
+ assertEquals(UpdateStatus.OK, result, "Valid update");
+ assertEquals(QuantityType.valueOf(17.6, SIUnits.CELSIUS), condHandler.getTemperature(), "Temperature");
+ assertEquals(QuantityType.valueOf(57.8, Units.PERCENT), condHandler.getHumidity(), "Humidity");
+ assertEquals(QuantityType.valueOf(986.8, HECTO(SIUnits.PASCAL)), condHandler.getPressure(), "Pressure");
+ assertEquals(QuantityType.valueOf(-1, HECTO(SIUnits.PASCAL)), condHandler.getPressureSea(), "Pressure Sea");
+ } else {
+ assertTrue(false);
+ }
+ }
}
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/DTOTest.java b/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/DTOTest.java
index 07ad76d65bf61..93355b0414776 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/DTOTest.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/DTOTest.java
@@ -20,8 +20,8 @@
import org.junit.jupiter.api.Test;
import org.openhab.binding.luftdateninfo.internal.dto.SensorData;
import org.openhab.binding.luftdateninfo.internal.dto.SensorDataValue;
-import org.openhab.binding.luftdateninfo.internal.handler.HTTPHandler;
import org.openhab.binding.luftdateninfo.internal.util.FileReader;
+import org.openhab.binding.luftdateninfo.internal.utils.Constants;
import com.google.gson.Gson;
@@ -44,16 +44,16 @@ public void testConditions() {
SensorData d = valueArray[0];
// Assure latest data is taken
String dateStr = d.getTimeStamp();
- if (dateStr.equals("2020-06-09 06:38:08")) {
+ if ("2020-06-09 06:38:08".equals(dateStr)) {
// take newer one
d = valueArray[1];
}
List sensorDataVaueList = d.getSensorDataValues();
assertNotNull(d);
sensorDataVaueList.forEach(v -> {
- if (v.getValueType().equals(HTTPHandler.TEMPERATURE)) {
+ if (Constants.TEMPERATURE.equals(v.getValueType())) {
assertEquals("22.70", v.getValue(), "Temperature");
- } else if (v.getValueType().equals(HTTPHandler.HUMIDITY)) {
+ } else if (Constants.HUMIDITY.equals(v.getValueType())) {
assertEquals("61.00", v.getValue(), "Humidity");
}
});
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/HTTPHandlerValueTest.java b/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/HTTPHandlerValueTest.java
index faaf90ef36528..ac4192cb06f15 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/HTTPHandlerValueTest.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/HTTPHandlerValueTest.java
@@ -22,6 +22,7 @@
import org.openhab.binding.luftdateninfo.internal.dto.SensorDataValue;
import org.openhab.binding.luftdateninfo.internal.handler.HTTPHandler;
import org.openhab.binding.luftdateninfo.internal.util.FileReader;
+import org.openhab.binding.luftdateninfo.internal.utils.Constants;
/**
* The {@link HTTPHandlerValueTest} test values decoding of HTTPHandler
@@ -61,9 +62,9 @@ public void testValueDecoding() {
}
private void testSensorValue(SensorDataValue s) {
- if (s.getValueType().equals(HTTPHandler.TEMPERATURE)) {
+ if (s.getValueType().equals(Constants.TEMPERATURE)) {
assertEquals("22.70", s.getValue(), "Temperature resource 1");
- } else if (s.getValueType().equals(HTTPHandler.HUMIDITY)) {
+ } else if (s.getValueType().equals(Constants.HUMIDITY)) {
assertEquals("61.00", s.getValue(), "Humidity resource 1");
} else {
assertTrue(false);
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/PMHandlerTest.java b/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/PMHandlerTest.java
index 3923dff4024bb..d30183b4e797b 100644
--- a/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/PMHandlerTest.java
+++ b/bundles/org.openhab.binding.luftdateninfo/src/test/java/org/openhab/binding/luftdateninfo/internal/PMHandlerTest.java
@@ -64,7 +64,7 @@ public void testValidConfigStatus() {
* Test if config status is 0 = CONFIG_OK for valid configuration. Take real int for comparison instead of
* BaseHandler constants - in case of change test needs to be adapted
*/
- assertEquals(ConfigStatus.OK, pmHandler.getConfigStatus(), "Handler Configuration status");
+ assertEquals(ConfigStatus.EXTERNAL_SENSOR_OK, pmHandler.getConfigStatus(), "Handler Configuration status");
}
@Test
@@ -161,11 +161,34 @@ public void testNullUpdate() {
HashMap properties = new HashMap();
// String sensorid taken from thing-types.xml
- properties.put("sensorid", 12345);
+ properties.put("ipAdress", "192.168.178.1");
t.setConfiguration(properties);
PMHandlerExtension pmHandler = new PMHandlerExtension(t);
UpdateStatus result = pmHandler.updateChannels(null);
assertEquals(UpdateStatus.CONNECTION_ERROR, result, "Valid update");
}
+
+ @Test
+ public void testInternalPMSensor() {
+ ThingMock t = new ThingMock();
+
+ HashMap properties = new HashMap();
+ // String sensorid taken from thing-types.xml
+ properties.put("sensorid", 12345);
+ t.setConfiguration(properties);
+
+ PMHandlerExtension pmHandler = new PMHandlerExtension(t);
+ pmHandler.initialize();
+ String pmJson = FileReader.readFileInString("src/test/resources/internal-data.json");
+ if (pmJson != null) {
+ UpdateStatus result = pmHandler.updateChannels("[" + pmJson + "]");
+ assertEquals(UpdateStatus.OK, result, "Valid update");
+ assertEquals(QuantityType.valueOf(4.3, Units.MICROGRAM_PER_CUBICMETRE), pmHandler.getPM25Cache(), "PM25");
+ assertEquals(QuantityType.valueOf(10.5, Units.MICROGRAM_PER_CUBICMETRE), pmHandler.getPM100Cache(),
+ "PM100");
+ } else {
+ assertTrue(false);
+ }
+ }
}
diff --git a/bundles/org.openhab.binding.luftdateninfo/src/test/resources/internal-data.json b/bundles/org.openhab.binding.luftdateninfo/src/test/resources/internal-data.json
new file mode 100644
index 0000000000000..04d75b42dc55e
--- /dev/null
+++ b/bundles/org.openhab.binding.luftdateninfo/src/test/resources/internal-data.json
@@ -0,0 +1,46 @@
+{
+ "software_version": "NRZ-2020-133",
+ "age": "112",
+ "sensordatavalues": [
+ {
+ "value_type": "SDS_P1",
+ "value": "10.52"
+ },
+ {
+ "value_type": "SDS_P2",
+ "value": "4.32"
+ },
+ {
+ "value_type": "BME280_temperature",
+ "value": "17.59"
+ },
+ {
+ "value_type": "BME280_pressure",
+ "value": "98680.28"
+ },
+ {
+ "value_type": "BME280_humidity",
+ "value": "57.78"
+ },
+ {
+ "value_type": "samples",
+ "value": "5070500"
+ },
+ {
+ "value_type": "min_micro",
+ "value": "28"
+ },
+ {
+ "value_type": "max_micro",
+ "value": "20091"
+ },
+ {
+ "value_type": "interval",
+ "value": "145000"
+ },
+ {
+ "value_type": "signal",
+ "value": "-81"
+ }
+ ]
+}
\ No newline at end of file