Auslöser eines Programms ermitteln und in Systemvariable schreiben

Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)

Moderatoren: jmaus, Co-Administratoren

Antworten
newpipe
Beiträge: 30
Registriert: 27.05.2018, 20:55
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Auslöser eines Programms ermitteln und in Systemvariable schreiben

Beitrag von newpipe » 23.07.2021, 10:24

Hi,

Um den auslösenden Rauchmelder zu ermitteln, würde ich gerne den Namen des auslösenden Gerätes in eine Systemvariable vom Typ "Zeichenkette" schreiben.

Begonnen habe ich mit der Anleitung von Alchy.

Allerdings scheint diese Anleitung nicht 1:1 nach Raspberrymatic übertragbar zu sein. Basierend auf den Kommentaren von Jens und Jerome in diesem Thread, habe ich versucht das Skript auf meiner Raspberrymatic zum laufen zu bekommen. Allerdings mit mäßigem Erfolg.

Das Problem ist, dass nur sehr selten der Name des auslösenden Gerätes in die Systemvariable geschrieben wird. In den meisten Fällen bleibt die Systemvariable "Rauchmelder" einfach leer. Hat jemand einen Tipp, was ich falsch mache?
Screenshot from 2021-07-23 10-18-48.png
Das Programm, welches aus den auslösenden Rauchmelder reagiert, und entsprechend die Systemvariable "Rauchmelder" befüllt.
Das zugehörige Skript:

Code: Alles auswählen

!Namen des Programmauslöser ermitteln und in Systemvariable schreiben
string list = "";
object dp = dom.GetObject("$src$");
var ch = dom.GetObject(dp).Channel();
var dev = dom.GetObject(ch).Device();
var name = dom.GetObject(dev).Name();
list = name.ToString();
! dom.GetObject(ID_SYSTEM_VARIABLES).Get('Rauchmelder').State(list);
dom.GetObject('Rauchmelder').State(list);
newpipe

Chemieka
Beiträge: 649
Registriert: 03.01.2017, 17:39
Hat sich bedankt: 4 Mal
Danksagung erhalten: 9 Mal

Re: Auslöser eines Programms ermitteln und in Systemvariable schreiben

Beitrag von Chemieka » 23.07.2021, 10:35

Keine Ahnung ob das Hilft. Ich machs so.
Ich habe eine Systemvariable als Zeichenkette.
Jetzt mache ich für jedes Gerät ein Programm welches so ausschaut.
6A7B5882-ADA1-47F1-827F-A5FB25CF4E7E.png
In einem Letzten Programm leere ich die Systemvariable wieder. Nach bestimmter Zeit oder mit Bestätigung.
PI3+ mit RaspberryMatic; PI4 mit IOBroker; Samsung Tab A mit Mediola Visualisierung; Harmony Hub; Philips Hue; Drei IP Cams; Zwei Leseköpfe an den Stromzählern; Reedkontakt (Arduino) am Wasserzähler; Drucksensor (Arduino); CUL433 für Intertechno und Somfy RTS; Nuki Bridge

Xel66
Beiträge: 14085
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 580 Mal
Danksagung erhalten: 1492 Mal

Re: Auslöser eines Programms ermitteln und in Systemvariable schreiben

Beitrag von Xel66 » 23.07.2021, 10:38

newpipe hat geschrieben:
23.07.2021, 10:24
In den meisten Fällen bleibt die Systemvariable "Rauchmelder" einfach leer.
Da ich eine der früheren Varianten von Alchys Script selbst einsetze, gehe ich davon aus, dass es grundsätzlich funktioniert. Daher vermute ich, dass Dir in 50% der Fälle der auslösende Rauchmelder fehlt. Nämlich immer dann, wenn wieder auf "kein Rauch" zurückgestellt wird. Denn dann überschreibt das Script den Inhalt mit dem Trigger der Sytemvariable (und wenn Systemvariablen nicht definiert sind, weil Du auf Channels prüfst, dann eben leer).

Möchtest Du eine Identifizierung des rückstellenden Rauchmelders, muss dieser auch mit "kein Rauch" den Scriptlauf triggern und dann darfst Du nicht auf die Systemvariable triggern. Das Programm wird aber bei mehr als einem ausgelösten Rauchmelder auch nicht sauber laufen. Das hat was mit der Abarbeitungsweise von Programmen zu tun. Daher wäre das Abtrennen des SONST WENN in ein separates Programm zielführend, wenn Du den rückstellenden Rauchmelder identifizieren willst.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

newpipe
Beiträge: 30
Registriert: 27.05.2018, 20:55
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Re: Auslöser eines Programms ermitteln und in Systemvariable schreiben

Beitrag von newpipe » 23.07.2021, 11:31

Danke für eure Antworten.
Chemieka hat geschrieben:
23.07.2021, 10:35
Jetzt mache ich für jedes Gerät ein Programm welches so ausschaut.
Das möchte ich aber vermeiden, dass ich für jeden Rauchmelder ein eigenes Programm erstellen muss.
Xel66 hat geschrieben:
23.07.2021, 10:38
Daher vermute ich, dass Dir in 50% der Fälle der auslösende Rauchmelder fehlt. Nämlich immer dann, wenn wieder auf "kein Rauch" zurückgestellt wird. Denn dann überschreibt das Script den Inhalt mit dem Trigger der Sytemvariable (und wenn Systemvariablen nicht definiert sind, weil Du auf Channels prüfst, dann eben leer).

Möchtest Du eine Identifizierung des rückstellenden Rauchmelders, muss dieser auch mit "kein Rauch" den Scriptlauf triggern und dann darfst Du nicht auf die Systemvariable triggern. Das Programm wird aber bei mehr als einem ausgelösten Rauchmelder auch nicht sauber laufen. Das hat was mit der Abarbeitungsweise von Programmen zu tun. Daher wäre das Abtrennen des SONST WENN in ein separates Programm zielführend, wenn Du den rückstellenden Rauchmelder identifizieren willst.

Gruß Xel66
Danke für deine Antwort.
Dieses Programm triggert nur auf "lokaler Alarm" der Rauchmelder. Alle anderen Rauchmelder lösen mit "fremdausgelöster Alarm" aus. Dementsprechend würde ich also erwarten, dass nur ein einziger Rauchmelder das Programm triggert.
Auch die Systemvariable, auf die der zweite Teil des Programms triggert, wird nur manuell zurückgesetzt. Lange, nachdem die Systemvariable gesetzt wurde, oder die Pushnachricht raus ist.

Ich habe nun aber trotzdem mal den zweiten Teil, das Rücksetzen der Systemvariable Rauch in ein separates Programm ausgelagert. Die Skripte habe ich mal so gelassen.

Die Programme sehen nun wie folgt aus:
Screenshot from 2021-07-23 11-25-58.png
Die beteiligten Programme
Screenshot from 2021-07-23 11-26-47.png
Alarmierung
Screenshot from 2021-07-23 11-27-43.png
Senden der Pushnachricht
Screenshot from 2021-07-23 11-28-28.png
Leeren der Systemvariable Rauchmelder
Ich teste mal, wenn die Familie wieder aus dem Haus draußen ist ;-)

newpipe

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Auslöser eines Programms ermitteln und in Systemvariable schreiben

Beitrag von MichaelN » 23.07.2021, 12:34

newpipe hat geschrieben:
23.07.2021, 11:31
Dieses Programm triggert nur auf "lokaler Alarm" der Rauchmelder.....
Auch die Systemvariable, auf die der zweite Teil des Programms triggert,
Vielleicht nur unglücklich formuliert, vielleicht aber auch falsche Erwartungshaltung.
Das Programm troggert sowohl auf die Änderungen der Rauchmelder, als auch auf die Änderung der Systemvariable.
Und zwar wirklich nur auf Änderung. Da wird noch nicht der Wahrheitsgehalt geprüft. Und dann wird das Programm von oben nach unten abgearbeitet und die Wahrheitstabelle geprüft.

Konkret: wenn die SV Rauch sich auf Feuer ändert, wird das Programm gestartet! Und nicht nur bei der Änderung auf "kein Rauch" und auch nciht nur der 2. Teil!
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

newpipe
Beiträge: 30
Registriert: 27.05.2018, 20:55
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Re: Auslöser eines Programms ermitteln und in Systemvariable schreiben

Beitrag von newpipe » 23.07.2021, 18:25

Danke für die Erläuterungen. Nun funktioniert das Programm. Das Problem war in der Tat, dass ich im selben Programm auch das Skript zum Rücksetzen der Systemvariable hatte.
MichaelN hat geschrieben:
23.07.2021, 12:34
Das Programm troggert sowohl auf die Änderungen der Rauchmelder, als auch auf die Änderung der Systemvariable.
Und zwar wirklich nur auf Änderung. Da wird noch nicht der Wahrheitsgehalt geprüft. Und dann wird das Programm von oben nach unten abgearbeitet und die Wahrheitstabelle geprüft.

Konkret: wenn die SV Rauch sich auf Feuer ändert, wird das Programm gestartet! Und nicht nur bei der Änderung auf "kein Rauch" und auch nciht nur der 2. Teil!
Jetzt verstehe ich was wohl das Problem war. Obwohl die Systemvariable erst geleert werden sollte, wenn die Systemvariable "Rauch" zurückgesetzt wird, wurde der "Sonst, dann" Zweig wohl ausgeführt, während der Programmaufruf vom ersten Rauchmelder lief. Ich hätte nämlich vermutet, dass das nicht passieren sollte, weil ja beide Bedingungen zu FALSE evaluieren sollten. Aber durch die vielen parallelen Programmaufrufe (viele Rauchmelder) kam es wohl zu diesem undefinierten verhalten.

newpipe

Antworten

Zurück zu „RaspberryMatic“