Seite 1 von 2

Probleme mit Rule nach Umstellung auf OH3

Verfasst: 3. Mai 2022 07:23
von teasy
Guten Morgen zusammen,

ich bin schon lange mit OH unterwegs, allerdings bin ich eher der Try and Error- Typ. Jetzt bin ich gerade dabei das System auf OH3 umzustellen und beisse mir die Zähne aus. Das Problem liegt wahrscheinlich an einer Rule aus dem alten Müllkalender, welchen bestimmt auch der ein oder andere noch installiert hat.Ich bekomme einfach keine Anzeige in der Sitemap.

Code: Alles auswählen

import org.joda.time.DateTime 

rule "Calculate trash dates gelb"
//aus Exec-Input Anzeige für Mülltermine berechnen
    when
		System started or
        Time cron "0 0 1 * * ?"
    then
        var DateTime date_yellow
        var DateTime date_now
        var String trash_yellow 
        
        date_yellow = parse(""+Exec_TrashYellow.state)
        date_now =  parse(""+now.getYear+"-"+now.getMonthOfYear+"-"+now.getDayOfMonth)
      
        if (date_now.equals(date_yellow)) { trash_yellow="heute" }
        else if (date_now.equals(date_yellow.minusDays(1))) { trash_yellow="morgen" }
        else if (date_now.equals(date_yellow.minusDays(2))) { trash_yellow="übermorgen" }
        else { trash_yellow=date_yellow.toString("E, dd.MM.yy") }

        TrashYellow.postUpdate(""+trash_yellow)
end
Wenn ich die Rule ausführe kommt immer die Fehlermeldung:
Script execution of rule with UID 'garbage-2' failed: Text cannot be parsed to a Duration in garbage
Wahrscheinlich ist das nur eine Kleinigkeit, aber ich komme nicht drauf.

Re: Probleme mit Rule nach Umstellung auf OH3

Verfasst: 3. Mai 2022 14:32
von udo1toni
Kannst Du bitte mal einen konkreten Status von Exec_TrashYellow angeben? Ich nehme an, es handelt sich um ein String Item? Warum überhaupt über Exec?

Re: Probleme mit Rule nach Umstellung auf OH3

Verfasst: 3. Mai 2022 15:33
von teasy
Hallo,

Exec, weil ich das schon seit Jahren so am laufen habe und ich jetzt nicht alles neu machen wollte.

Also, der Staus des Exec_TrashYellow ist 2022-05-12.

Nochmal zu Erklärung: Die einzelnen Termine sucht sich das Script aus Text-Dateien. Ich poste hiermal zum Verständnis alle wichtigen Dateien.
Das hier ist die garbage.rule

Code: Alles auswählen

 import org.joda.time.DateTime 

rule "Calculate trash dates gelb"
//aus Exec-Input Anzeige für Mülltermine berechnen
    when
		System started or
        Time cron "0 0 1 * * ?"
    then
        var DateTime date_yellow
        var DateTime date_now
        var String trash_yellow 
        
        date_yellow = parse(""+Exec_TrashYellow.state)
        date_now =  parse(""+now.getYear+"-"+now.getMonthOfYear+"-"+now.getDayOfMonth)
      
        if (date_now.equals(date_yellow)) { trash_yellow="heute" }
        else if (date_now.equals(date_yellow.minusDays(1))) { trash_yellow="morgen" }
        else if (date_now.equals(date_yellow.minusDays(2))) { trash_yellow="übermorgen" }
        else { trash_yellow=date_yellow.toString("E, dd.MM.yy") }

        TrashYellow.postUpdate(""+trash_yellow)
end

rule "Calculate trash dates blau"
//aus Exec-Input Anzeige für Mülltermine berechnen
    when
		System started or
        Time cron "0 0 1 * * ?"
    then
        var DateTime date_blue
        var DateTime date_now
        var String trash_blue 
        
        date_blue = parse(""+Exec_TrashBlue.state)
        date_now =  parse(""+now.getYear+"-"+now.getMonthOfYear+"-"+now.getDayOfMonth)
      
        if (date_now.equals(date_blue)) { trash_blue="heute" }
        else if (date_now.equals(date_blue.minusDays(1))) { trash_blue="morgen" }
        else if (date_now.equals(date_blue.minusDays(2))) { trash_blue="übermorgen" }
        else { trash_blue=date_blue.toString("E, dd.MM.yy") }

        TrashBlue.postUpdate(""+trash_blue)
end

rule "Calculate trash dates normal"
//aus Exec-Input Anzeige für Mülltermine berechnen
    when
		System started or
        Time cron "0 0 1 * * ?"
    then
        var DateTime date_black
        var DateTime date_now
        var String trash_black 
        
        date_black = parse(""+Exec_TrashBlack.state)
        date_now =  parse(""+now.getYear+"-"+now.getMonthOfYear+"-"+now.getDayOfMonth)
      
        if (date_now.equals(date_black)) { trash_black="heute" }
        else if (date_now.equals(date_black.minusDays(1))) { trash_black="morgen" }
        else if (date_now.equals(date_black.minusDays(2))) { trash_black="übermorgen" }
        else { trash_black=date_black.toString("E, dd.MM.yy") }

        TrashBlack.postUpdate(""+trash_black)
end
Dann gibt es noch die garbage.thing

Code: Alles auswählen

Thing exec:command:trash_blue "Blaue Tonne" [command="bash /etc/openhab/scripts/trash.sh blue",interval=60,timeout=5,transform="REGEX((.*?))"]
Thing exec:command:trash_black "Restmüll" [command="bash /etc/openhab/scripts/trash.sh black",interval=60,timeout=5,transform="REGEX((.*?))"]
Thing exec:command:trash_yellow "Gelber Sack" [command="bash /etc/openhab/scripts/trash.sh yellow",interval=60,timeout=5,transform="REGEX((.*?))"]
Das hier ist die trash.sh

Code: Alles auswählen

#!/bin/bash
#Aktuelles Datum einlesen (inkl. Uhrzeit)
datum=$(date +%s)

#Müllart aus 1. Argument einlesen
trash_kind=$1

#entsprechend der gewählten Müllart die zu durchsuchende Datei festlegen
trash_file="/etc/openhab/scripts/trash_$trash_kind.txt"

#Schleife, die die Textdatei zeilenweise durchläuft, und beim 1. größeren Datum abbricht und dieses ausgibt
#eingelesenes Datum ohne Zeit ist immer 00:00:00h
#86399sec = 23:59:59h -> somit wird der aktuelle Tag mitgezählt
while read datum_line
do
    datum_line_sec=$(date -d $datum_line +%s)
    let datum_diff=$datum-$datum_line_sec
    if [ $datum_diff -lt 86399 ]
    then
        echo $datum_line
        exit 0
    fi
done < $trash_file

echo "Error"
exit 1;
Hier die Sitemap:

Code: Alles auswählen

String Exec_TrashBlack 					{channel="exec:command:trash_black:output"}
String TrashBlack "Normaler Müll [%s]"
String Exec_TrashYellow 				{channel="exec:command:trash_yellow:output"}
String TrashYellow "Gelbe Tonne [%s]"
String Exec_TrashBlue 					{channel="exec:command:trash_blue:output"}
String TrashBlue "Blaue Tonne [%s]"
In der exec.whitelist steht:

Code: Alles auswählen

bash /etc/openhab/scripts/trash.sh blue
bash /etc/openhab/scripts/trash.sh black
bash /etc/openhab/scripts/trash.sh yellow

Die einzelnen Termine werden aus trash_black.txt, trash_blue.txt und trash_yellow.txt geholt. Da trage ich immer zum Jahresanfang die Termine ein.
Ich weiß, geht bestimmt auch charmanter, aber auf OH2.5 läuft es seit Jahren.
Ich setzte zur Zeit ein neues OH3 auf einem separatem Raspi4b auf.

Re: Probleme mit Rule nach Umstellung auf OH3

Verfasst: 3. Mai 2022 20:48
von udo1toni
Das ging auch unter OH1 schon besser ;)

Um das ursprüngliche Verhalten nachzubilden, müsstest Du die Rule etwa so anpassen:

Code: Alles auswählen

rule "Calculate trash dates gelb" //aus Exec-Input Anzeige für Mülltermine berechnen
when
    System started or
    Time cron "0 0 1 * * ?"
then
    val date_now    = ZonedDateTime.now().with(LocalTime.MIDNIGHT)                           //  heute, Mitternacht
    val date_yellow = ZonedDateTime.parse(Exec_TrashYellow.state.toString+"T00:00:00.000Z")  // yellow, Mitternacht
    logInfo("trash","yellow: date_yellow = {} - date_now = {}",date_yellow, date_now)
    var String trash_yellow = date_yellow.toString("E, dd.MM.yy")

    if(date_now.equals(date_yellow))
        trash_yellow="heute"
    else if(date_now.equals(date_yellow.minusDays(1)))
        trash_yellow="morgen"
    else if(date_now.equals(date_yellow.minusDays(2)))
        trash_yellow="übermorgen"

    logInfo("trash","yellow: trash_yellow = {}",trash_yellow)
    TrashYellow.postUpdate(trash_yellow)
end
Bei den equals-Funktionen bin ich nicht sicher, zumindest wird aber das Parsen funktionieren. date_yellow enthält allerdings ein komplettes JavaTime Objekt, deshalb der angefügte Teilstring.

Joda Time gibt es in openHAB3 nicht mehr. Der Import war allerdings schon in der späteren OH1-Reihe nicht notwendig (so etwa ab OH1.5...)

Die logInfo Zeilen sind zum Debuggen :)

EDIT: doppeltes Komma entfernt

Re: Probleme mit Rule nach Umstellung auf OH3

Verfasst: 4. Mai 2022 19:30
von teasy
Besten Dank erstmal für deine Mühe.

Habe die Rule jetzt so geändert. Nach dem abspeichern hatte ich sofort diesen Eintrag im Log:

Code: Alles auswählen

Configuration model 'garbage.rules' has errors, therefore ignoring it: [10,62]: no viable alternative at input ','
Wenn ich die Rule richtig deute, müsste ja nach einem Neustart von Openhab die Werte in der Sitemap angezeigt werden. Ist aber leider nicht.
Dann habe ich auch noch das Phänomen, daß ich die drei Rules nicht mehr unter Einstellungen/Rules sehe. Ich schwöre, die waren vorher da. :shock:

Re: Probleme mit Rule nach Umstellung auf OH3

Verfasst: 4. Mai 2022 21:44
von int5749
teasy hat geschrieben: 4. Mai 2022 19:30 Habe die Rule jetzt so geändert. Nach dem abspeichern hatte ich sofort diesen Eintrag im Log:

Code: Alles auswählen

Configuration model 'garbage.rules' has errors, therefore ignoring it: [10,62]: no viable alternative at input ','
In einer Zeile hat sich ein KOMMA zu viel eingeschlichen, (ein blindes Huhn ...)

Code: Alles auswählen

logInfo("trash","yellow: date_yellow = {} - date_now = {}",date_yellow, date_now)
Zu dem wundersammen verschwinden der Rules habe ich keine Idee.

Re: Probleme mit Rule nach Umstellung auf OH3

Verfasst: 5. Mai 2022 10:41
von udo1toni
So ist es... da hat wohl die Taste geprellt :)

Wenn die drei Rules in der gleichen Datei liegen, ist das Verschwinden leicht erklärbar. Die Fehlermeldung besagt ja, dass die Rule Fehler enthält. In diesem Fall ist der Fehler so schwerwiegend (aus Sicht des Parsers), dass die Interpretation der Datei komplett abgebrochen wird. In der Folge sind dann alle Rules aus dieser Datei "weg", obwohl in ihnen gar kein Fehler vorliegt.

Re: Probleme mit Rule nach Umstellung auf OH3

Verfasst: 5. Mai 2022 16:21
von teasy
Wollte nur Teilerfolg melden.

Im Log und in der Sitemap steht jetzt
2022-05-06T00:00Z
.
Und anscheinend kann er mit

Code: Alles auswählen

if(date_now.equals(date_blue.minusDays(1)))
        trash_blue="morgen"
nichts anfangen, denn morgen wäre der blaue Müll dran und es wird nur das Datum geschrieben.

In der Sitemap habe ich noch

Code: Alles auswählen

Text item=TrashBlue   icon="trash_blue"   valuecolor=["heute"="red","morgen"="orange"]
stehen. Also müsste er mir eigentlich "morgen" in orangener Farbe rauswerfen.

Re: Probleme mit Rule nach Umstellung auf OH3

Verfasst: 5. Mai 2022 20:25
von udo1toni
Wichtiger wäre, was das Log zum Zeitpunkt der Aktualisierung ausspuckt.

Re: Probleme mit Rule nach Umstellung auf OH3

Verfasst: 6. Mai 2022 11:25
von teasy
Kann das leider erst morgen wieder testen, bin unterwegs.
Aber ich freue mich, daß sich hier jemand meinem Problem annimmt.