Seite 1 von 2

Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 5. Nov 2023 12:30
von Absinthe
Hallo openHab-Fans,

ich möchte mir eine Liste mit Erinnerungen für wiederkehrende Aufgaben im Haus erstellen. Sind aktuell so ca. 50 Stück übers Jahr verteilt. Beispiel Wasserfilter spülen oder den Wasserfilter am Kühlschrank tauschen...

Damit ich dafür nicht 50+ Rules brauche würde ich die Aufgaben gerne in zwei Rules packen.

Aufbau ist so, dass ein ITEM "KG_Wasserfilter_Spuelung" als DateTime fungiert und dazugehörig ein ITEM "KG_Wasserfilter_Spuelung_Reset" als Switch mit Expiration Timer 5 Sek. existiert.

Plan wäre es, wenn ich den Switch betätigte, dass eine Rule in das erste ITEM das aktuelle Datum schreibt. Klappt natürlich nicht wie gedacht :D

Code: Alles auswählen

configuration: {}
triggers:
  - id: "2"
    configuration:
      command: ON
      itemName: Group_Putzen_Reset
    type: core.ItemCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "3"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-2
          val PutzenResetSwitch = Group_Putzen_Reset.members.filter[i|i.name.startsWith(triggeringItem.name)].head
              var ItemNamePutzen = i|i.name.startsWith(triggeringItem.name)
              postUpdate(ItemNamePutzen, new DateTimeType())
    type: script.ScriptAction
Natürlich geht die Rule, ohne Log Eintrag auf die Bretter... Jemand eine Idee, wo mein Fehler liegt?

Der zweite Teil, ist noch nicht angefangen... Hier wäre der Gedanken eine Rule, die jeden Samstag prüft, ob ein Item älter als X Tage ist. Hier denke ich aber, dass ich nicht davon komme, die einzelnen Aufgaben einzeln zu nennen...

Wäre aber als Gedanke:

Code: Alles auswählen

if (KG_Wasserfilter_Spuelung < 30){
[Mache irgendwas...]
}
Grüße

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 5. Nov 2023 14:58
von udo1toni
Die einfachste Variante ist vermutlich, eine zweite Gruppe zu erstellen. Außerdem musst Du den Trigger ändern :) der ist verkehrt.

Code: Alles auswählen

Group gPutzenDate
Group gPutzenReset
DateTime KG_Wasserfilter_Spuelung "KG Wasserfilter letzter Reset" (gPutzenDate)
Switch KG_Wasserfilter_Spuelung_Reset "KG Wasserfilter Reset" (gPutzenReset)
und als Rule:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      command: ON
      itemName: gPutzenReset
      type: core.GroupCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: |-
          val setDate = gPutzenDate.members.filter[i|i.name.startsWith(triggeringItem.name)].head
          setDate.postUpdate(new DateTimeType())
    type: script.ScriptAction
Der Trigger versteckt sich unter Add Trigger -> Show all
Da das passende DateTime Item den gleichen Namen trägt, nur ohne das _Reset am Ende, ist es das Einfachste, dieses Item aus der Gruppe zu selektieren und dann direkt zu verwenden, die Rule ist also noch ein wenig einfacher :)

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 6. Nov 2023 21:07
von Absinthe
Hi udo1toni,

wie immer Weltklasse! Vielen Dank.

Ich bekomme es nur leider nicht zum Laufen. Außer einer kryptischen Log-Meldung...

2023-11-06 21:00:09.981 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Putzen_Timer' failed: cannot invoke method public abstract java.lang.String org.openhab.core.items.Item.getName() on null

Bzw. auch gar keine Log-Meldung. Du Rule läuft einfach durch...

Eine Idee? Ich vermute, dass Deine Rule nicht für den GUI Editor in OH4 gedacht ist, sondern als Text-Basierte Rule?

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 7. Nov 2023 10:38
von udo1toni
Absinthe hat geschrieben: 6. Nov 2023 21:07 Ich vermute, dass Deine Rule nicht für den GUI Editor in OH4 gedacht ist, sondern als Text-Basierte Rule?
Nein, es ist irrelevant, wie die Rule erzeugt wurde, wichtig ist nur, dass für jedes Item in Gruppe 1 ein Item in Gruppe 2 zur Verfügung steht.

Kann es sein, dass Du die Rule noch auf eine andere Weise triggerst?
Die Rule darf ausschließlich von dem ON-Befehl auf einen Member der Gruppe gPutzenReset ausgelöst werden (Name der Gruppe ist natürlich egal, aber diesen habe ich im Code als Trigger eingegeben).

Die implizite Variable (eigentlich ist es ein genericItem Objekt) triggeringItem steht ausschließlich in Rules zur Verfügung, die über Member of ... getriggert wurden.

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 7. Nov 2023 10:53
von udo1toni
Falls die Rule keinen weiteren Trigger hat, aber dennoch triggert...

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      command: ON
      itemName: gPutzenReset
      type: core.GroupCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: |-
          if(triggeringItem === null) return;
          val setDate = gPutzenDate.members.filter[i|i.name.startsWith(triggeringItem.name)].head
          setDate.postUpdate(new DateTimeType())
    type: script.ScriptAction
Die Rule wird sofort beendet, falls das Objekt triggeringItem nicht existiert.

EDIT: Typo korrigiert.

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 8. Nov 2023 20:24
von Absinthe
Hallo udo1toni,

die Rule wird nur durch ein Member der Gruppe getiggert. Durch ein Umlegen eines Switches in der sitemap.

Kann es sein, dass die Rule auf die Bretter geht, weil das ITEM leer ist - also mit Wer NULL belegt ist? Müsste man bei NULL ggf. einen initialen Wert schreiben?

VG

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 8. Nov 2023 23:48
von udo1toni
Nein, die Fehlermeldung lautet ja

Code: Alles auswählen

cannot invoke method public abstract java.lang.String org.openhab.core.items.Item.getName() on null
Das heißt, die Methode getName() kann nicht auf das Element null angewendet werden.
Es gibt zwei Stellen im Code, ein denen getName aufgerufen wird (wobei das Schlüsselwort in der DSL nur name ist, es handelt sich aber um die gleiche Funktion):

Code: Alles auswählen

i.name
und

Code: Alles auswählen

triggeringItem.name
triggeringItem ist der Stellvertreter für das Item, welches die Rule getriggert hat (unter der Voraussetzung, dass der Trigger Member of ist)
i ist der Stellvertreter für das Item aus der Liste der Member, welches gerade untersucht wird.
keines der beiden Elemente kann null sein, wenn Du kein Element in der Gruppe gPutzenDate hast, wird die Schleife erst gar nicht durchlaufen, anderenfalls ist i zu jedem Zeitpunkt eines der Items der Gruppe. triggeringItem wird vor dem Starten der Rule von openHAB auf das Item gesetzt, welches die Rule gertriggert hat. Die Meldung ist also so nicht möglich.

Allerdings sehe ich gerade, dass ich im letzten Code einen Tippfehler habe (triggeringItm statt triggeringItem), auch da wäre immer möglich (ein Tippfehler beim Übernehmen der Rule) Hast Du die Gruppen definiert? Hast Du die Items zugeordnet?

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 10. Nov 2023 22:16
von Absinthe
Hallo udo1toni,

vielen Dank mal wieder für Deine ausführlichen Erklärungen und Hilfestellungen.

Hier mal mein Code und meine Gruppen inkl. Items...

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      command: ON
      groupName: Group_Putzen_Reset
    type: core.GroupCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-
        if(triggeringItem === null) return;

        val setDate = Group_Putzen.members.filter[i|i.name.startsWith(triggeringItem.name)].head

        setDate.postUpdate(new DateTimeType())
        
             val pushoverActions = getActions("pushover", "pushover:pushover-account:XXX")
            val String strMessage = "Rule ist durchlaufen. Ausgelöst hat: "+ triggeringItem.label +". Status vom: "+new DateTimeType().format("%1$td.%1$tm.%1$ty %1$tH:%1$tM")
            pushoverActions.sendPriorityMessage(strMessage,"openHab - Hinweis",0) 
    type: script.ScriptAction
Bildschirmfoto 2023-11-10 um 22.01.39.png
Bildschirmfoto 2023-11-10 um 22.01.49.png
Ich seh tatsächlich den Wald voller Bäume nicht mehr und bin ratlos... Im Log steht nichts...

Ich habe die Rule, um eine Push-Nachricht erweitert... Diese kommt zuverlässig mit dem richtigen Item, welches triggert an... Es schein so, als würde

Code: Alles auswählen

 val setDate = Group_Putzen.members.filter[i|i.name.startsWith(triggeringItem.name)].head

        setDate.postUpdate(new DateTimeType())
        


das Problem liegen.

Eine Idee?

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 10. Nov 2023 23:20
von udo1toni
Da hilft nichts... Du musst etwas Logging in die Rule einbauen:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      command: ON
      groupName: Group_Putzen_Reset
    type: core.GroupCommandTrigger
conditions: []
actions:
  - inputs: {}
    id: "2"
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >-
        if(triggeringItem === null) return;

        logInfo("putzenReset","Item {} hat Befehl ON empfangen.", triggeringItem.name)
        val setDate = Group_Putzen.members.filter[i|i.name.startsWith(triggeringItem.name)].head
        if(setDate !== null)
            logInfo("putzenReset","Zugehöriges Item {} ", setDate.name)
        else 
            logWarn("putzenReset","kein zugehöriges Item gefunden!")
        if(setDate !== null)
            setDate.postUpdate(new DateTimeType())

        val pushoverActions = getActions("pushover", "pushover:pushover-account:XXX")
        val String strMessage = "Rule ist durchlaufen. Ausgelöst hat: "+ triggeringItem.label +". Status vom: "+new DateTimeType().format("%1$td.%1$tm.%1$ty %1$tH:%1$tM")
        pushoverActions.sendPriorityMessage(strMessage,"openHab - Hinweis",0) 
    type: script.ScriptAction
Die Ausgabe des Logs findest Du anschließend in openhab.log, wenn Du oppenHABian nutzt, sollte das Log auch über Port 9001 komfortabel über Webbrowser einsehbar sein.

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Verfasst: 10. Nov 2023 23:45
von Absinthe
Das Logging greift...

Leider hab ich kein openHABian ;) Mein openHAB läuft als Docker auf einer Synology.
2023-11-10 23:40:29.218 [INFO ] [penhab.core.model.script.putzenReset] - Item Putzen_EG_Wischen_Reset hat Befehl ON empfangen.
2023-11-10 23:40:29.222 [WARN ] [penhab.core.model.script.putzenReset] - kein zugehöriges Item gefunden!
2023-11-10 23:42:32.562 [INFO ] [penhab.core.model.script.putzenReset] - Item Putzen_EG_WC_Reset hat Befehl ON empfangen.
2023-11-10 23:42:32.566 [WARN ] [penhab.core.model.script.putzenReset] - kein zugehöriges Item gefunden!
2023-11-10 23:42:33.486 [INFO ] [penhab.core.model.script.putzenReset] - Item Putzen_OG_Staubsaugen_Reset hat Befehl ON empfangen.
2023-11-10 23:42:33.490 [WARN ] [penhab.core.model.script.putzenReset] - kein zugehöriges Item gefunden!
2023-11-10 23:42:34.203 [INFO ] [penhab.core.model.script.putzenReset] - Item Putzen_OG_Wischen_Reset hat Befehl ON empfangen.
2023-11-10 23:42:34.206 [WARN ] [penhab.core.model.script.putzenReset] - kein zugehöriges Item gefunden!
Das lässt ja nur den Schluss zu, dass in der Gruppe Group_Putzen kein passendes ITEM gefunden wird... aber diese sind da und auch korrekt benannt...