Waschmaschinenstatus mit OH3

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Anbeku
Beiträge: 216
Registriert: 12. Nov 2020 10:26
Answers: 4

Waschmaschinenstatus mit OH3

Beitrag 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?

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: Waschmaschinenstatus mit OH3

Beitrag 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

Anbeku
Beiträge: 216
Registriert: 12. Nov 2020 10:26
Answers: 4

Re: Waschmaschinenstatus mit OH3

Beitrag von Anbeku »

Ok, danke, das verstehe ich soweit. Wahrscheinlich ist es in der Tat das einfachste, das einfach eine eine Rule-Datei zu schreiben.

Anbeku
Beiträge: 216
Registriert: 12. Nov 2020 10:26
Answers: 4

Re: Waschmaschinenstatus mit OH3

Beitrag 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?

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: Waschmaschinenstatus mit OH3

Beitrag 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.

Anbeku
Beiträge: 216
Registriert: 12. Nov 2020 10:26
Answers: 4

Re: Waschmaschinenstatus mit OH3

Beitrag 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:

Code: Alles auswählen

var ReentrantLock finishLock  = new ReentrantLock()

Anbeku
Beiträge: 216
Registriert: 12. Nov 2020 10:26
Answers: 4

Re: Waschmaschinenstatus mit OH3

Beitrag 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.

Anbeku
Beiträge: 216
Registriert: 12. Nov 2020 10:26
Answers: 4

Re: Waschmaschinenstatus mit OH3

Beitrag 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.

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Waschmaschinenstatus mit OH3

Beitrag 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:

Code: Alles auswählen

val Number nMeinVergleichswert = 5|°C
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:

Code: Alles auswählen

if(MeinUoMItem.state <= 5|W)
Der Vorteil mit Einheit besteht natürlich darin, dass man die Umrechnung abgenommen bekommt:

Code: Alles auswählen

if(MeinUoMItem.state <= 0.005|kW)
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.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Anbeku
Beiträge: 216
Registriert: 12. Nov 2020 10:26
Answers: 4

Re: Waschmaschinenstatus mit OH3

Beitrag 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:

Code: Alles auswählen

if(MeinUoMItem.state <= 5|W)
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:

Code: Alles auswählen

if(MeinUoMItem.state <= 0.005|kW)
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:

Code: Alles auswählen

if(MeinUoMItem.state <= 5)
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.

Antworten