Rule mit Groupon und unterschiedlichen ITEM-Namen

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Absinthe
Beiträge: 78
Registriert: 16. Jan 2022 13:30
Answers: 0

Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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
OpenHAB 4.1.1
in einem Docker-Container
auf einer Synology DS1515+

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

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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 :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Absinthe
Beiträge: 78
Registriert: 16. Jan 2022 13:30
Answers: 0

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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?
OpenHAB 4.1.1
in einem Docker-Container
auf einer Synology DS1515+

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

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Absinthe
Beiträge: 78
Registriert: 16. Jan 2022 13:30
Answers: 0

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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
OpenHAB 4.1.1
in einem Docker-Container
auf einer Synology DS1515+

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

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Absinthe
Beiträge: 78
Registriert: 16. Jan 2022 13:30
Answers: 0

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
OpenHAB 4.1.1
in einem Docker-Container
auf einer Synology DS1515+

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

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Absinthe
Beiträge: 78
Registriert: 16. Jan 2022 13:30
Answers: 0

Re: Rule mit Groupon und unterschiedlichen ITEM-Namen

Beitrag 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...
OpenHAB 4.1.1
in einem Docker-Container
auf einer Synology DS1515+

Antworten