Seite 2 von 3

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 12:23
von int5749
Hi

evtl. noch ein anderer Ansatz als Alternative, wobei auch zum Teil aus der Feder von Udo1Toni ;-)

Ich nutze 2 Kontakte am Garagentor, kann aber sicher auch gegen 1 Item für den Status geändert werden.

Mein Ansatz ist es unabhängig von der Tageszeit zu wissen, wann die Garage auffährt und wenn sie nicht geschlossen wurde. Ferner möchte ich, wenn sie nicht geschlossen wurde - einen schalter in der Visu um das Tor zu fahren/schliessen. Wenn ich nach Hause komme, kann ich die Garage bereits von einer Umgehungsstr. über einen FB öffnen und bekomme dann durch die Nachricht eine Haptik auf die Uhr ;-) So weiß ich, die Garage fährt auf und ich kann straight einfahren (Ja, Bequemlichkeit, aber eben darum angenehm ;-) ) War ein positiver Nebeneffekt der Rule, wichtiger ist mir zu wissen wann das Tor aufsteht.

Der nächste Schritt ist dann die Kopplung mit der Präsenzerkennung und ggfs. auch Tageszeit, damit Abends noch ein Licht im Schalfzimmer angeht (als Alarm) wenn auf einmal die Garage auffährt.

Natürlich freue ich mich auch über Verbesserungsvorschläge für diese Rule oder Anregungen für sinnvolle Erweiterungen ;-))

Viele Grüße
Jörg

Code: Alles auswählen

var Timer garageOpen = null

	// Garagentor Status
rule Garagentor
when
	Item Tor_Garage_o changed or
	Item Tor_Garage_u changed or
	System started
then
	if (Tor_Garage_o.state == CLOSED && Tor_Garage_u.state == OPEN) {
		Tor_Garage.postUpdate("OPEN")
	} else if (Tor_Garage_o.state == OPEN && Tor_Garage_u.state == CLOSED) {
		Tor_Garage.postUpdate("CLOSED")
	} else {//if (Tor_Garage_o.state == OPEN && Tor_Garage_u.state == OPEN) {
		Tor_Garage.postUpdate("MOVE")
	}
end

rule Garage
when
	Item Tor_Garage changed
then
	if (Tor_Garage.state == "MOVE" && previousState == "CLOSED") {
		pushNotification("Information", "Garagentor fährt auf: " + now)
		// Garagentorwaechter
		if(garageOpen===null){
		garageOpen = createTimer(now.plusMinutes(5)) [|
			myGarageSwitchVis.postUpdate(ON)
			pushNotification("Achtung", "Garagentor steht offen: " + now)
			]
		}
	}
	else if (Tor_Garage.state == "OPEN" && previousState == "MOVE") {
//		pushNotification("Information", "Garagentor ist geöffnet: " + now)
	}
	else if (Tor_Garage.state == "MOVE" && previousState == "OPEN") {
//		pushNotification("Information", "Garagentor fährt zu: " + now)
	}
	else if (Tor_Garage.state == "CLOSED" && previousState == "MOVE") {

		garageOpen.cancel
		garageOpen = null
		
		if (myGarageSwitchVis.state == ON) {
			pushNotification("Information", "Garagentor wurde geschlossen: " + now)
		} else {
//			pushNotification("Information", "Garagentor ist geschlossen: " + now)
		}
		myGarageSwitchVis.postUpdate(OFF)
	}
end
Items

Code: Alles auswählen

	/* Garage */
Contact Tor_Garage_o 			{channel="knx:device:bridge:xxx:ch2"}		//"Tor oben
Contact Tor_Garage_u 			{channel="knx:device:bridge:xxx:ch1"}		//"Tor unten
String Tor_Garage				"Garagentor [MAP(de.map):%s]"		<garagedoor>	(Garage)
Switch Garagentor				"Garagentor"	<garagedoor>	channel="knx:device:bridge:xxx:ch11",autoupdateautoupdate="false"}
Switch myGarageSwitchVis
Sitemap

Code: Alles auswählen

Text item=Tor_Garage visibility=[myGarageSwitchVis=="OFF"]
Switch item=Garagentor visibility=[myGarageSwitchVis=="ON"] mappings=[ON="Garagentor schliessen"]

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 12:47
von lenschith
umgedreht hatte ich das um jetzt zu testen, aber mit deinem Script klappt das jetzt. Nur wäre es ist toll wenn die Notification nur einmal kommt wenn die schon gesendet wurde. Ich hätte das so gemacht aber das klappt nicht. Hast du eine Idee wie ich das Sinnvoll lösen kann?

Code: Alles auswählen

rule "Notification Garage"
when
    Time cron "0 0/5 12-23,0-4 * * ?" //zwischen 21:00:00 Uhr und 4:59:59 Uhr, alle 5 Minuten zur vollen Minute
then
    if(ShellyGaragentorstatusAddOn.state == 1 && notificationName_Garage.state == ON && opensend == 0) {
        sendNotification('name@domain.de', "Garage geöffnet")
        val opensend = 1
    }
    else (ShellyGaragentorstatusAddOn.state == 0) {
        val opensend = 0
        logInfo("INFO","GarageRule", ShellyGaragentorstatusAddOn.state.toString, opensend)
    }
end

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 13:18
von udo1toni
Ja, schon fast richtig, aber dann doch knapp vorbei...

Der Ansatz den Du verfolgst, ist dann doch etwas suboptimal. Aber der Reihe nach:
Einen Merker, der über die Laufzeit einer Rule hinaus seinen Zustand behält, musst Du global definieren, sonst wird er bei der nächsten Ausführung der Rule erneut initialisiert. Der Code ist auch sonst fallig völsch ;) denn Du definierst den Merker als Konstante innerhalb der Bedingung. Die zweite Bedingung (nach dem else) ist dann auch daneben, weil das Schlüsselwort if fehlt.
logInfo() benötigt exakt zwei Strings als Parameter, Du kannst nicht einfach mehr dorthin übergeben. Aufgeräumt und korrigiert sähe die Rule eher so aus:

Code: Alles auswählen

var Boolean bSent = false  // Merker, ob schon eine Benachrichtigung raus ging

rule "Notification Garage"
when
    Time cron "0 0/5 12-23,0-4 * * ?" //zwischen 21:00:00 Uhr und 4:59:59 Uhr, alle 5 Minuten zur vollen Minute
then
    if(ShellyGaragentorstatusAddOn.state == 1 && notificationName_Garage.state == ON && !bSent) {
        sendNotification('name@domain.de', "Garage geöffnet")
        bSent = true
    }
    else if(ShellyGaragentorstatusAddOn.state == 0) {
        bSent = false
        logInfo("garage","Status: {}, sent: {}", ShellyGaragentorstatusAddOn.state, bSent)
    }
end
Nun ist dieser Code aber, zumindest, was das logInfo() betrifft, sinnfrei, da beide variablen Inhalte bereits feststehen, man könnte also auch

Code: Alles auswählen

        logInfo("garage","Status: 0, sent: false")
schreiben, das macht keinen Unterschied.

Was Du wirklich willst: Eine Rule triggert, falls das Tor geöffnet oder geschlossen wird oder es 21 Uhr wird. Die Rule startet einen Timer (sagen wir mal 5 Minuten), falls das Zeitfenster passt. Mit Ablauf des Timers wird eine Notification gesendet. Wird das Tor vorher geschlossen, wird der Timer abgebrochen. So:

Code: Alles auswählen

var Timer tNote = null  // Timer für Notification

rule "Notification Garage"
when
    Item ShellyGaragentorstatusAddOn changed or
    Time cron "0 0 21 * * ?" //um 21:00:00 Uhr
then
    logInfo("garage","Notification Garage getriggert, Status: {}", ShellyGaragentorstatusAddOn.state)
    tNote?.cancel
    if(ShellyGaragentorstatusAddOn.state == 1)
        if(now.getHourOfDay > 20 || now.getHourOfDay < 5) // zwischen 21 Uhr und 5 Uhr
            tNote = createTimer(now.plusMinutes(5), [|
                sendNotification('name@domain.de', "Garage ist seit mindestens 5 Minuten geöffnet!")
            ])
end
Es gibt nur einen Alarm, wenn das Zeitfenster passt und die Garage nicht rechtzeitig geschlossen wird. Es gibt nur maximal einen Alarm pro Öffnung.

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 14:10
von lenschith
ohne deine Hilfe wäre ich verloren :(
Ich habe das jetzt so wie du vorgeschlagen hast eingebaut und etwas angepasst damit ich das testen kann.
Aber ich bekomme keine Notification und im Log kann ich ebenfalls nichts sehen.
Wo habe ich schon wieder Mist gebaut?

Code: Alles auswählen

var Timer tNote = null  // Timer für Notification
rule "Notification Garage"
when
    Item ShellyGaragentorstatusAddOn changed or
    Item Dummy changed to ON or
    Time cron "0 0 21 * * ?" //um 21:00:00 Uhr
then
    logInfo("garage","Notification Garage getriggert, Status: {}", ShellyGaragentorstatusAddOn.state)
    tNote?.cancel
    if(ShellyGaragentorstatusAddOn.state == 0)
        if(now.getHourOfDay > 12 || now.getHourOfDay < 5) // zwischen 21 Uhr und 5 Uhr
            tNote = createTimer(now.plusMinutes(1), [|
                sendNotification('name@domain.de', "Garage ist seit mindestens 5 Minuten geöffnet!")
            ])
end

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 14:44
von lenschith
Habe eben gesehen das ich folgende Fehlermeldung bekomme

Code: Alles auswählen

{
	"resource": "/openhab/conf/rules/notification.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.diagnostics.Diagnostic.Syntax",
	"severity": 8,
	"message": "missing EOF at 'var'",
	"startLineNumber": 127,
	"startColumn": 1,
	"endLineNumber": 127,
	"endColumn": 4
}

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 14:54
von int5749
Also ich habe die Rule gerade mal eben(d) bei mir eingebaut und nur meine Testschalter Items erweitert und => es funktioniert.

Hast Du "var Timer tNote = null // Timer für Notification" nach GANZ oben in der Datei? Vor allen anderen Rules?
"startLineNumber": 127,
Sieht im Moment nicht so aus, bitte mal in Zeile 1 verschieben

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 15:20
von lenschith
Das war das Problem. Danke

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 18:55
von udo1toni
Genau. Globale Variablen und Konstanten (und auch Lambdas und imports) müssen innerhalb der Datei vor der ersten Rule definiert werden.

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 21:17
von lenschith
ich habe noch ein Problem das ich einfach nicht lösen kann.
Ich habe eine Gruppe mit einigen Switch Items. Ich möchte eine Rule erstellen und dann als Notification erhalten welches Gerät Offline ist.
Kann ich das irgendwie umsetzen?

Code: Alles auswählen

rule "Notification LAN "
when
    Item gOnlineMonitor changed or  
    Item Dummy changed to ON
then
    if (notificationStefan_LAN.state == ON) {
    sendNotification('name@domain.de', "Netzwerkkomponente ausgefallen " + gOnlineMonitor.state.toString)
    } 
end
Also ich bekomme schon eine Benachrichtigung aber dort ist nur OFF enthalten.

Re: Notification senden mit Item Inhalt

Verfasst: 3. Jan 2021 22:07
von lenschith
Ich habe was gefunden, oder habt ihr noch eine bessere Idee?

Code: Alles auswählen

gOnlineMonitor.members.filter[i | i.state==OFF ])