Seite 1 von 2
Waschmaschinenstatus mit OH3
Verfasst: 7. Jan 2021 21:05
von Anbeku
Ich stehe noch recht am Anfang und habe bisher nur einfache Schalter teilweise mit Timern realisiere. Jetzt mal etwas komplexere Logik. Ich würde gerne den status meiner Waschmaschine (läuft/aus/standby) anhand des Stromverbrauchs ermitteln und darstellen. Einen string per rule setzen habe ich schon geschafft, aber mit dem trigger funktioniert es nicht so richtig. Ich habe erst gedacht, das geht über die Gui mit drei rules, die jeweils auf Änderungen von einem ins andere Intervall abfragen. also die erste sieht in yaml so aus:
Code: Alles auswählen
triggers:
- id: "1"
configuration:
itemName: Waschmaschine_Leistung
state: ">2"
previousState: <2
type: core.ItemStateChangeTrigger
conditions: []
actions:
- inputs: {}
id: "2"
configuration:
itemName: Status
state: Läuft
type: core.ItemStateUpdateAction
Geht das so überhaupt? Seltsam, dass um einen state Anführungszeichen gesetzt werden und um den anderen nicht. Aber neben kleiner und größer bräuchte ich auch noch innerhalb oder außerhalb einen Bereiches bzw. jeweils zwei kleiner und größer Vergleiche. Oder ist das dafür zu komplex und ich muss ein Skript schreiben?
Re: Waschmaschinenstatus mit OH3
Verfasst: 7. Jan 2021 21:11
von Cyrelian
Hi,
also bei mir läuft das so. Hab die Rule auch jetzt unter openhab 3 laufen.
Code: Alles auswählen
import java.util.concurrent.locks.ReentrantLock
var boolean message = true
val String filename = "power.rules"
val actions = getActions("pushover", "pushover:pushover-account:openHAB")
var receipt = null
var ReentrantLock finishLock = new ReentrantLock()
// Betriebszustand Waschmaschine
val Number MODE_OFF = 0
val Number MODE_STANDBY = 1
val Number MODE_ACTIVE = 2
val Number MODE_FINISHED = 3
// Anbieterpreis für KWh incl. MwSt.
var Number Waschmaschine_Var_WH
var Number Trockner_Var_WH
var Number ESSL_KWH=0.2569
rule "Waschmaschine / Trockner Überwachung: Initial"
when
System started
then
createTimer(now.plusSeconds(180)) [|
if (Waschmaschine_OpState == NULL) Waschmaschine_OpState.postUpdate(MODE_OFF)
if (Trockner_OpState == NULL) Trockner_OpState.postUpdate(MODE_OFF)
]
end
/**
* Waschmaschine
* Aus: 0,05 - 0,07 W
* Standby/Fertig: 4,3W
* Aktiv: bis 2300W (bisher gesehener Mindestwert 4,55W)
*/
rule "Waschmaschine Überwachung: Verbrauchszuordnung"
when
Item Waschmaschine_Power changed
then
//logInfo(filename, "Waschmaschine Überwachung: Verbrauchszuordnung")
if (Waschmaschine_Power.state < 0.2) Waschmaschine_OpState.postUpdate(MODE_OFF)
else if (Waschmaschine_Power.state > 10) Waschmaschine_OpState.postUpdate(MODE_ACTIVE)
else if (Waschmaschine_Power.state < 4.5) {
if (Waschmaschine_OpState.state == MODE_OFF) Waschmaschine_OpState.postUpdate(MODE_STANDBY)
else if (Waschmaschine_OpState.state == MODE_ACTIVE) {
finishLock.lock()
try {
// Debounce for 30 seconds
Thread::sleep(30000)
if (Waschmaschine_Power.state < 4.5) Waschmaschine_OpState.postUpdate(MODE_FINISHED)
} finally {
finishLock.unlock()
}
}
}
end
rule "Waschmaschine Überwachung: Benachrichtigung"
when
Item Waschmaschine_OpState changed
then
if (Waschmaschine_OpState.state == MODE_FINISHED) {
if (message) {
receipt = actions.sendMessage("Waschmaschine fertig!", "openHAB")
}
}
end
CU
Cyrelian
Re: Waschmaschinenstatus mit OH3
Verfasst: 7. Jan 2021 21:52
von Anbeku
Ok, danke, das verstehe ich soweit. Wahrscheinlich ist es in der Tat das einfachste, das einfach eine eine Rule-Datei zu schreiben.
Re: Waschmaschinenstatus mit OH3
Verfasst: 7. Jan 2021 22:01
von Anbeku
Noch eine weitere Frage: Eigentlich möchte ich nicht zwischen "Standby" und "Finished" unterscheiden, aber ich fürchte ohne dies wird die Benachrichtigung nicht funktionieren, oder gibt es eine Möglichkeit, nach dem Item Waschmaschine_OpState changed" trigger zu sehen, von welchem state man gekommen ist?
Re: Waschmaschinenstatus mit OH3
Verfasst: 7. Jan 2021 22:37
von Cyrelian
Hi,
also entweder Du nimmst in der ersten Rule den Teil mit "Standby" und "Finished" raus oder arbeitest in der zweiten Rule mit einem switch/case statement und fragst auf den passenden "CASE" ab.
Re: Waschmaschinenstatus mit OH3
Verfasst: 8. Jan 2021 21:47
von Anbeku
Ich bekomme die Rule nicht zum laufen. Da scheint etwas mit dem anlegen des locks nicht zu funktionieren:
Code: Alles auswählen
2021-01-08 21:39:47.641 [WARN ] [e.runtime.internal.RuleContextHelper] - Variable 'finishLock' on rule file 'waschmaschine.rules' cannot be initialized with value 'org.eclipse.xtext.xbase.impl.XConstructorCallImplCustom@18428b5 (invalidFeatureIssueCode: null, validFeature: false, explicitConstructorCall: true, anonymousClassConstructorCall: false)': An error occurred during the script execution: null
Für mich leider nicht sehr aussagekräftig, aber das scheint sich auf die Zeile zu beziehen:
Re: Waschmaschinenstatus mit OH3
Verfasst: 9. Jan 2021 13:13
von Anbeku
Ich bin jetzt mal dazu übergegangen die Rule Schritt für schritt selber zu schreiben. Prinzipiell läuft sie, gibt Logausgaben und setzt den state um aber irgendwie laufen die if Abfragen nicht. Ich habe das mal auf den minimalen Fall reduziert:
Code: Alles auswählen
if (Waschmaschine_Leistung.state < 0.2){
logInfo("Waschmaschiene", "Waschmaschine Überwachung: off")
Waschmaschine_Status.postUpdate(MODE_OFF)
}
else if (Waschmaschine_Leistung.state >= 0.2) {
logInfo("Waschmaschiene","Waschmaschine Überwachung: active")
Waschmaschine_Status.postUpdate(MODE_ACTIVE)
}
logInfo("Waschmaschiene","Waschmaschine Überwachung: ende {}", Waschmaschine_Leistung.state)
Hier würde ich erwarten, dass entweder die Ausgabe "off" oder "active" kommen, aber es kommt nur die Ausgabe "Waschmaschine Überwachung: ende 124.7 W". Offenbar trifft keiner der Vergleiche zu? Kann das sein, dass es da der Datentyp falsch ist und Waschmaschine_Leistung.state gar kein numerischer Wert? Muss ich da etwas konvertieren? Bin leider nicht der Java Experte.
Re: Waschmaschinenstatus mit OH3
Verfasst: 9. Jan 2021 16:19
von Anbeku
Was ich raus gefunden habe ist, dass "Waschmaschine_Leistung.state" vom Typ QuantityType ist, also quasi eine Zahl mit Einheit, weswegen man sie offenbar nicht direkt mit einer Zahl Vergleichen kann. Wenn man sie in eine Zahl umwandelt, funktionert der vergleich. Sauberer wäre es wahrscheinlich, den zu vergliechenden wert in einen QuantityType umzuwandeln, aber das habe ich noch nicht hinbekommen.
Re: Waschmaschinenstatus mit OH3
Verfasst: 9. Jan 2021 22:07
von udo1toni
Jepp, UoM ist gerne mal ein Fallstrick. Das ist aber schon in openHAB2 so gewesen...
Es gibt grundsätzlich zwei Möglichkeiten. Entweder Du strippst die Einheit weg:
Code: Alles auswählen
val Number nMeinWert = (MeinUoMItem.state as Number).floatValue
oder Du ergänzt die Einheit:
wobei es auch sein kann, dass der Teil hinter der Pipe in Anführungszeichen stehen muss. Natürlich funktioniert das auch ohne Variablen zu nutzen, also so:
Der Vorteil mit Einheit besteht natürlich darin, dass man die Umrechnung abgenommen bekommt:
Das ist natürlich eindrcksvoller, wenn es z.B. um Temperaturen geht, wo der Vergleichswert zu einem Temperatur in °Celsius dann auch gerne in °Fahrenheit oder in Kelvin angegeben werden darf.
Re: Waschmaschinenstatus mit OH3
Verfasst: 11. Jan 2021 13:54
von Anbeku
udo1toni hat geschrieben: ↑9. Jan 2021 22:07
Jepp, UoM ist gerne mal ein Fallstrick. Das ist aber schon in openHAB2 so gewesen...
Ich selber habe ja openHAB2 nie selber administriert und stolpere jetzt nur drüber, weil ich eine übernommene Rule laufen lassen wollte, was wahrscheinlich eh nicht das beste war. Daher versuche ich jetzt erst mal zu verstehen, was ich da mache. Eigentlich ist es ja eine gute Sache mit dem UoM, man muss es nur wissen.
udo1toni hat geschrieben: ↑9. Jan 2021 22:07
wobei es auch sein kann, dass der Teil hinter der Pipe in Anführungszeichen stehen muss. Natürlich funktioniert das auch ohne Variablen zu nutzen, also so:
Genau so funktioniert es, danke!
udo1toni hat geschrieben: ↑9. Jan 2021 22:07
Der Vorteil mit Einheit besteht natürlich darin, dass man die Umrechnung abgenommen bekommt:
Das ist natürlich eindrcksvoller, wenn es z.B. um Temperaturen geht, wo der Vergleichswert zu einem Temperatur in °Celsius dann auch gerne in °Fahrenheit oder in Kelvin angegeben werden darf.
Das hat diverse Vorteile. Erst mal macht es auch Code verständlicher, weil bei "2|W" weiß man beim lesen, dass das ein Leistung in Watt ist, während das sonst im besten Fall aus dem Kontext hervorgeht. Es macht die Sache aber auch sehr viel sicherer. Nun ist es vielleicht nicht so tragisch, wenn jemand sich den Ar**** abfriert, weil er sein Haus auf 20 Grad Celsius heizen wollte, aber der Thermostat das als 20 Grad Fahrenheit interpretiert hat. Es sind aber auch in der Geschichte der Softwareentwicklung schon sehr tragische Dinge passiert, weil Software einen Zahlenwert anders interpretiert hat, als er gedacht war.
Was mich aber eigentlich sehr wundert ist, dass so etwas:
einfach durchläuft. Wenn "state" ein Datentyp ist und "5" ein andere hätte ich eins von folgendem erwartet:
* Das sicherste: Spätestens das Ausführen der Zeile erzeugt eine Fehlermeldung, dass man hier unzulässigerweise zwei unterschiedliche Datentypen
vergleicht.
* Weniger sicher: der Wert 5 wird implizit zum selben Datentyp konvertiert, also aus "5" wird beispielsweise 5 Watt wenn MeinUoMItem.state auch in
Watt ist.
Es passiert aber keins von beidem. Der Ausdruck läuft einfach durch und macht irgendwas was mir nicht klar ist. Evaluiert vielleicht immer zu "false" egal was MeinUoMItem.state für einen Wert hat.