Seite 6 von 9

Re: Meldung Waschmaschine wenn fertig

Verfasst: 26. Jun 2021 17:56
von peter-pan
Läuft dein VSC auf einer Windows-Maschine ?
Hier ein Link auf einen Thread im internationalen Forum ? Evtl. könnte es daran liegen, dass du deinen OH-conf-Ordner nicht mit einem Netzwerklaufwerk verbunden hast.

Re: Meldung Waschmaschine wenn fertig

Verfasst: 26. Jun 2021 21:24
von Snatsch
Ja VSC läuft auf meinen Windows Rechner. Ich habe ja alle meine Rules über VSC eingerichtet und das ist die einzige wo der Fehler kommt.

Re: Meldung Waschmaschine wenn fertig

Verfasst: 26. Jun 2021 23:06
von Snatsch
jetzt geht es, in meinem OH-conf-Ordner unter Settings war irgendwie der openhab.connection.authToken nicht gespeichert. Keine Ahnung warum er da nur bei der einen Rule rumgemeckert hat. Vor allen habe ich die gleiche Rule auch für meinen Trockner und da kam die Fehlermeldung nicht.

Re: Meldung Waschmaschine wenn fertig

Verfasst: 27. Jun 2021 14:14
von Innocent
udo1toni hat geschrieben: 17. Mai 2021 15:05 Ich gehe mal davon aus, dass Du mit der Boolean Variable verhindern willst, dass Du ständig eine Meldung erhältst?

Ist das Item BatteryLevelKZ vom Typ Number? Oder ist es doch eher vom Typ Number:Dimensonless? Dann sollte die Rule eher so aussehen;

Code: Alles auswählen

var Boolean bBatterieKZ = false

rule "Batterie Thermoastat GWC"
when
    Item BatteryLevelKZ changed
then
    val nLevel = (BatteryLevelKZ.state as Number).intValue
    if(!bBatterieKZ && nLevel >= 30) 
        bBatterieKZ = true 
    if(bBatterieKZ && nLevel < 30) {
        sendTelegram("Sascha","Thermostat Gäste WC Batterie 30%")
        bBatterieKZ = false
    }
end
Durch die Verwendung der lokalen Konstanten wird der Code kompakter. Der Vergleich sollte den vollständigen Wertebereich umfassen, also auch die 30 selbst beinhalten (deshalb >=)

Da diese Rule nun funktioniert wie ich es wollte, würde ich das gleiche für zwei weitere Thermostate einrichten wollen.
Einfach kopieren und Items anders benennen? 🤔

Re: Meldung Waschmaschine wenn fertig

Verfasst: 27. Jun 2021 16:10
von udo1toni
Kannste so machen, ist dann halt kacke. :)
Richtig erledigt man das, indem man die NAmen der Items günstig wählt, die Items in Gruppen zusammenfasst und dann eine Rule erstellt, die sich um alle gleichartigen Items kümmert.

Im vorliegenden Fall muss bBatterieKZ zusätzlich als Array definiert werden, für jeden Thermostaten eine Boolean Variable.

Alternativ legst Du stattdessen Switch Items an, in denen Du speicherst, ob eine Warnmeldung ausgegeben wurde. Da Du diese Items persistieren kannst, hat das auch den Vorteil, dass Du auch nach einem Neustart von openHAB nicht alle Meldungen erneut bekommst.

Re: Meldung Waschmaschine wenn fertig

Verfasst: 27. Jun 2021 16:54
von Innocent
Items könnte ich umbenennen. Sind bloß drei.
Wie müsste ich die Gruppen machen? Und wie müsste die Rule aussehen?

Danke schonmal 😁

Re: Meldung Waschmaschine wenn fertig

Verfasst: 4. Aug 2021 09:11
von Innocent
udo1toni hat geschrieben: 27. Jun 2021 16:10 Kannste so machen, ist dann halt kacke. :)
Richtig erledigt man das, indem man die NAmen der Items günstig wählt, die Items in Gruppen zusammenfasst und dann eine Rule erstellt, die sich um alle gleichartigen Items kümmert.

Im vorliegenden Fall muss bBatterieKZ zusätzlich als Array definiert werden, für jeden Thermostaten eine Boolean Variable.
Wie müsste das denn aussehen? 🤔
udo1toni hat geschrieben: 27. Jun 2021 16:10Alternativ legst Du stattdessen Switch Items an, in denen Du speicherst, ob eine Warnmeldung ausgegeben wurde. Da Du diese Items persistieren kannst, hat das auch den Vorteil, dass Du auch nach einem Neustart von openHAB nicht alle Meldungen erneut bekommst.

Re: Meldung Waschmaschine wenn fertig

Verfasst: 26. Aug 2021 14:08
von Innocent
Wie kann ich denn jedem Thermostaten eine Variable geben?
Wie definiere bBatterieKZ als array?

Re: Meldung Waschmaschine wenn fertig

Verfasst: 23. Mai 2022 10:27
von Innocent
udo1toni hat geschrieben: 27. Jun 2021 16:10 Kannste so machen, ist dann halt kacke. :)
Richtig erledigt man das, indem man die NAmen der Items günstig wählt, die Items in Gruppen zusammenfasst und dann eine Rule erstellt, die sich um alle gleichartigen Items kümmert.

Im vorliegenden Fall muss bBatterieKZ zusätzlich als Array definiert werden, für jeden Thermostaten eine Boolean Variable.

Alternativ legst Du stattdessen Switch Items an, in denen Du speicherst, ob eine Warnmeldung ausgegeben wurde. Da Du diese Items persistieren kannst, hat das auch den Vorteil, dass Du auch nach einem Neustart von openHAB nicht alle Meldungen erneut bekommst.

Kannst du mir hier eventuell noch weiterhelfen?

Re: Meldung Waschmaschine wenn fertig

Verfasst: 23. Mai 2022 15:38
von udo1toni
Ja, sicher. Leider habe ich das Thema nicht angezeigt bekommen...

also, ausgehend von Deiner Rule oben:

Code: Alles auswählen

var Boolean bBatterieKZ = false

rule "Batterie Thermoastat GWC"
when
    Item BatteryLevelKZ changed
then
    val nLevel = (BatteryLevelKZ.state as Number).intValue
    if(!bBatterieKZ && nLevel >= 30) 
        bBatterieKZ = true 
    if(bBatterieKZ && nLevel < 30) {
        sendTelegram("Sascha","Thermostat Gäste WC Batterie 30%")
        bBatterieKZ = false
    }
end
Nehme ich mal an, dass die anderen Items, um die es geht, dann ebenfalls mit BatteryLevel beginnen. Wie erwähnt wäre es vermutlich das einfachste, die Boolean Variable durch einen Switch zu ersetzen. Ich nenne das Item dann der Einfachheit halber AlarmBatteryLevelKZ, die Status sind ON und OFF.
Der Trick ist nun, alle gleichartigen Items in zwei Gruppen zusammenzufassen, ich nenne diese Gruppen mal gBatteryLevel und gAlarmBatteryLevel. Letztlich sind aber die Group Namen egal, genauso wie der Typ. Nun muss die Rule noch etwas geändert werden:

Code: Alles auswählen

rule "Batterie Level"
when
    Member of gBatteryLevel changed                                                   // Trigger auf Group-Member change
then
    val nLevel = if(newState instanceof Number) (newState as Number).intValue else -1 // Lese den Level
    val String strItem = triggeringItem.name                                          // Der Name des Items, welches die Rule ausgelöst hat
    val mySwitch = gAlarmBatteryLevel.members.filter[i|i.name endsWith(strItem)].head // Suche das passende Alarm Item heraus
    val strLabel = mySwitch.label                                                     // oder triggeringItem.label, wenn das Label passt
    if(nLevel < 0) {
        logWarn("batlevel","Achtung! Sensor {} lieferte keine Zahl: {}",strItem,newState)
        return;
    }
    if(mySwitch.state != ON && nLevel >= 30)                                          // Rest wie gehabt, nur mit Item statt Variable...
        mySwitch.postUpdate(ON)
    if(mySwitch.state == ON && nLevel < 30) {
        sendTelegram("Sascha","Thermostat " + strLabel + " Batterie 30%")
        mySwitch.postUpdate(OFF)
    }
end
Der eigentliche Trick besteht darin, die Namen der Items so zu wählen, dass man aus dem einen Namen den anderen Namen direkt ableiten kann.
Damit in der Message ein Klartextname genannt werden kann, muss dieser aus dem Label abgeleitet werden können. Es bietet sich an, hierfür das Label der Alarm Switches oder evtl. sogar des Original Items zu verwenden.
Sollte es noch andere Geräte als nur Thermostate geben, man die Label nur entsprechend anpassen und das Telegramm einkürzen, so dass das Wort "Thermostat " auch im Label vorkommt.
Wenn es komplexer wird, bietet es sich an, die Namensteile durch _ voneinander zu trennen, z.B. Battery_Level_KZ. Dann kann man mittels .name.split("_").get(2) z.B. auf den letzten Namensteil zugreifen (get() arbeitet 0-indiziert).

Für den Fall, dass ein Item keinen gültigen Wert liefert, wird ein Eintrag ins Log geschrieben und die Rule bricht ab.