- Platform information:
- Hardware: Rpi3
- OS: Openhabian (Raspbian GNU/Linux 9.9 (stretch))
- Java Runtime Environment: openjdk version “1.8.0_152”
OpenJDK Runtime Environment (Zulu Embedded 8.25.0.76-linux-aarch32hf) (build 1.8.0_152-b76)
OpenJDK Client VM (Zulu Embedded 8.25.0.76-linux-aarch32hf) (build 25.152-b76, mixed mode, Evaluation) - openHAB version: 2.4.0
I’ve been trying to setup the Washing Machine State System with Bouncy State Elimination using Persistence as written here.
items
Switch Wasmachine "Wasmachine" <washingmachine> (gWaskamer, gWitgoed) { mqtt=">[sonoff1:cmnd/sonoff_wasmachine/POWER:command:*:default], <[sonoff1:stat/sonoff_wasmachine/POWER:state:default]" }
Switch Droger "Droger" <dryer> (gWaskamer, gWitgoed) { mqtt=">[sonoff1:cmnd/sonoff_droger/POWER:command:*:default], <[sonoff1:stat/sonoff_droger/POWER:state:default]" }
Number Wasmachine_watt "Wasmachine verbruik [%.1f W]" <energy> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_wasmachine/SENSOR:state:JSONPATH($.ENERGY.Power)]" }
Number Wasmachine_voltage "Wasmachine voltage [%d V]" <energy> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_wasmachine/SENSOR:state:JSONPATH($.ENERGY.Voltage)]" }
Number Wasmachine_ampere "Wasmachine ampere [%.3f А]" <energy> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_wasmachine/SENSOR:state:JSONPATH($.ENERGY.Current)]" }
Number Wasmachine_today "Wasmachine verbruik vandaag [%.3f kWh]" <line> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_wasmachine/SENSOR:state:JSONPATH($.ENERGY.Today)]" }
Number Wasmachine_yesterday "Wasmachine verbruik gisteren [%.3f kWh]" <line> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_wasmachine/SENSOR:state:JSONPATH($.ENERGY.Yesterday)]" }
Number Wasmachine_total "Wasmachine verbruik totaal [%.3f kWh]" <line> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_wasmachine/SENSOR:state:JSONPATH($.ENERGY.Total)]" }
Number Wasmachine_Status "Wasmachine Status [%d]" <washingmachine>
Number Droger_watt "Droger verbruik [%.1f W]" <energy> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_droger/SENSOR:state:JSONPATH($.ENERGY.Power)]" }
Number Droger_voltage "Droger voltage [%d V]" <energy> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_droger/SENSOR:state:JSONPATH($.ENERGY.Voltage)]" }
Number Droger_ampere "Droger ampere [%.3f А]" <energy> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_droger/SENSOR:state:JSONPATH($.ENERGY.Current)]" }
Number Droger_today "Droger vandaag [%.3f kWh]" <line> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_droger/SENSOR:state:JSONPATH($.ENERGY.Today)]" }
Number Droger_yesterday "Droger gisteren [%.3f kWh]" <line> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_droger/SENSOR:state:JSONPATH($.ENERGY.Yesterday)]" }
Number Droger_total "Droger gisteren [%.3f kWh]" <line> (gVerbruik) { mqtt="<[sonoff1:tele/sonoff_droger/SENSOR:state:JSONPATH($.ENERGY.Total)]" }
Number Droger_Status "Droger Status [%d]" <dryer>
Rules
val Number MODE_OFF = 0
val Number MODE_STANDBY = 1
val Number MODE_ACTIVE = 2
val Number MODE_FINISHED = 3
rule "Wasmachine Consumption State Machine"
when
Item Wasmachine_watt changed
then
if ((Wasmachine_watt.averageSince(now.minusMinutes(2)) as Number) < 1) Wasmachine_Status.postUpdate(MODE_OFF)
else if ((Wasmachine_watt.averageSince(now.minusMinutes(2)) as Number) > 10) Wasmachine_Status.postUpdate(MODE_ACTIVE)
else if ((Wasmachine_watt.averageSince(now.minusMinutes(2)) as Number) < 4) {
if (Wasmachine_Status.state == MODE_OFF) Wasmachine_Status.postUpdate(MODE_STANDBY)
else if (Wasmachine_Status.state == MODE_ACTIVE) Wasmachine_Status.postUpdate(MODE_FINISHED)
}
end
rule "Droger Consumption State Machine"
when
Item Droger_watt changed
then
//val Number nAvg = Droger_watt.averageSince(now.minusMinutes(2)) as Number
//logInfo("nAvg value", "nAvg" + nAvg)
if ((Droger_watt.averageSince(now.minusMinutes(2)) as Number) < 1) {
logInfo("Verbruik", "Droger watt = " + (Droger_watt.averageSince(now.minusMinutes(2)) as Number))
logInfo("Verbruik", "1 Drogerstatus = " + Droger_Status.state.toString + " " + Droger_watt.averageSince(now.minusMinutes(2)) + " " + Droger_watt.state.toString)
//Droger watt = null
//1 Drogerstatus = 0 null 1
Droger_Status.postUpdate(MODE_OFF)
}
else if ((Droger_watt.averageSince(now.minusMinutes(2)) as Number) > 100) {
logInfo("Verbruik", "2 Drogerstatus = " + Droger_Status.state.toString)
Droger_Status.postUpdate(MODE_ACTIVE)
}
else if ((Droger_watt.averageSince(now.minusMinutes(2)) as Number) < 3) {
logInfo("Verbruik", "3 Drogerstatus = " + Droger_Status.state.toString)
if (Droger_Status.state == MODE_OFF) {
Droger_Status.postUpdate(MODE_STANDBY)
logInfo("Verbruik", "4 Drogerstatus = " + Droger_Status.state.toString)
} else if (Droger_Status.state == MODE_ACTIVE) {
Droger_Status.postUpdate(MODE_FINISHED)
logInfo("Verbruik", "5 Drogerstatus = " + Droger_Status.state.toString)
}
}
end
jdbc is selected as default persistence service.
Droger_watt persistence using jdbc with mariadb:
The database gets filled, so why is Droger_watt.averageSince(now.minusMinutes(2)) as Number
always returned as null
?
It looks very similair as this post, but it was never resolved.
If I follow the instructions there this should work:
logInfo("Verbruik", "Droger watt = " + Droger_watt.averageSince(now.minusMinutes(2)).toString)
But I get this error:
Error: Rule 'Droger Consumption State Machine': cannot invoke method public java.lang.String org.eclipse.smarthome.core.library.types.DecimalType.toString() on null
The same error when I add as Number
to that logInfo line.
I’ve been fighting with this code for a few hours, I don’t see it anymore. Who can help me?
NB the washingmachine part is also not working, I just added some extra logging to the dryer, both rules do the same.