Notification senden mit Item Inhalt

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Notification senden mit Item Inhalt

Beitrag 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"]
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Notification senden mit Item Inhalt

Beitrag 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
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

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

Re: Notification senden mit Item Inhalt

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

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Notification senden mit Item Inhalt

Beitrag 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
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Notification senden mit Item Inhalt

Beitrag 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
}
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Notification senden mit Item Inhalt

Beitrag 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
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Notification senden mit Item Inhalt

Beitrag von lenschith »

Das war das Problem. Danke
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

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

Re: Notification senden mit Item Inhalt

Beitrag von udo1toni »

Genau. Globale Variablen und Konstanten (und auch Lambdas und imports) müssen innerhalb der Datei vor der ersten Rule definiert werden.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Notification senden mit Item Inhalt

Beitrag 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.
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

Benutzeravatar
lenschith
Beiträge: 314
Registriert: 11. Dez 2020 22:36
Answers: 0

Re: Notification senden mit Item Inhalt

Beitrag von lenschith »

Ich habe was gefunden, oder habt ihr noch eine bessere Idee?

Code: Alles auswählen

gOnlineMonitor.members.filter[i | i.state==OFF ])
openHAB4.3.3 in einem Docker Container auf RPI5-8GB, AVM: Fritz!Box 7590 - SMART301/302 - Comet, SMART200/210, SMART440, Alexa, Shelly, Tasmota, ESP Easy, WLED

Antworten