Skript: Meldung bei offenen Fenstern
Moderator: Co-Administratoren
-
- Beiträge: 4
- Registriert: 11.01.2023, 17:14
- System: CCU und Access Point
- Hat sich bedankt: 4 Mal
Re: Skript: Meldung bei offenen Fenstern
Hat mit beleidigt sein nichts zu tun, habe nur gemerkt, dass die Rolle als Publisher hier nix für mich ist. Aber deine Antwort spricht Bände und bekräftigt meine Entscheidung. Lehnst dich ganz schön weit aus dem Fenster, ohne zu wissen mit wem du es zu tun hast
-
- Beiträge: 9786
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 710 Mal
- Danksagung erhalten: 1651 Mal
Re: Skript: Meldung bei offenen Fenstern
Mafia?
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 +++
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 +++
-
- Beiträge: 4
- Registriert: 11.01.2023, 17:14
- System: CCU und Access Point
- Hat sich bedankt: 4 Mal
Re: Skript: Meldung bei offenen Fenstern
Erfasst
Spaß beiseite und ganz allgemein gemeint: Leider sind sehr viele Kommentare nicht lösungs-, sondern problemorientiert und ich habe das Gefühl, dass viele zeigen wollen, wie großartig ihr Wissen bezüglich HM Script ist, aber konstruktiv ist es dann nur in manchen Fällen. Das ist natürlich für Anfänger und Neulinge sehr demotivierent. In diesem Fall hier wurde zum Beispiel sehr darauf rumgeritten, wie schlecht es ist, ein minütliches Zeitintervall zu nutzen, dass die Vorlage ja von 2014 ist, es schon zig Threads zu dem Thema gibt und Kanäle/Geräteabfragen überholt sind. Bis auf Baxxy kommt keiner konstruktiv mit einem wirklichen Verbesserungsansatz um die Ecke (ich erwarte keine Code-Snippets!). Das bringt mir nichts, dann tüftle ich lieber für mich selbst, probiere aus und hab zumindest daran ein wenig Spaß. Es ist nicht so, dass mich das groß kränkt oder ich mich beleidigt. Man stellt sich dann aber dennoch die Frage: Brauche ich das? Außerdem fühle ich mich dann auch nicht verpflichtet, Fehler/Optimierungsmöglichkeiten sofort umsetzen zu müssen. Ich hoffe ich stehe alleine mit meiner Meinung da, sonst wird es schwierig, nicht nur Tiefe, sondern auch Breite hier in das Forum und bei Autoren hineinzubekommen.
-
- Beiträge: 9786
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 710 Mal
- Danksagung erhalten: 1651 Mal
Re: Skript: Meldung bei offenen Fenstern
Das mag daran liegen, daß diese Themen schon zig mal durchdiskutiert wurden und man das Rad nicht jedesmal neu drehen will. Wenn die hingeworfenen Versatzstücke dein Interesse wecken, dann kannst Du auch hinterfragen oder im Forum suchen. Einer konkreten technischen Diskussion wird hier keiner aus dem Wege gehen.
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 +++
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 +++
-
- Beiträge: 389
- Registriert: 19.06.2017, 09:24
- Hat sich bedankt: 20 Mal
- Danksagung erhalten: 67 Mal
Re: Skript: Meldung bei offenen Fenstern
Ich bin mal so frei und hänge mich mit einer Frage bzw. Bitte hier dran.
Bei mir schreibt ein Programm die Anzahl der offenen Fenster in eine Systemvariable. Bei Aktualisierung der Systemvariable schicke ich diese per Pushover (als Prio -1 ohne Benachrichtung) an unsere Handys, dort wird die Anzahl der offenen Fenster dann als Widget angezeigt. Man könnte damit auch die beliebte Meldung bei Abwesenheit oder ähnliches machen.
Einmal angelegt läuft das und so oft ändern sich ja die Fenster nicht, die man überwachen will. Trotzdem dachte ich wäre es cooler, wenn man die Sensoren nicht im Skript nochmal extra einzeln namentlich aufführen müsste.
Meine Idee wäre gewesen, ähnlich diesem Skript die Sensoren aus dem Programm auszulesen und der Reihe nach abzufragen. Aber leider kapiere ich das Skript doch zu wenig, um es entsprechend umzubauen.
Bei mir schreibt ein Programm die Anzahl der offenen Fenster in eine Systemvariable. Bei Aktualisierung der Systemvariable schicke ich diese per Pushover (als Prio -1 ohne Benachrichtung) an unsere Handys, dort wird die Anzahl der offenen Fenster dann als Widget angezeigt. Man könnte damit auch die beliebte Meldung bei Abwesenheit oder ähnliches machen.
Code: Alles auswählen
Wenn
Fenster Wohnzimmer ist geschlossen, bei Änderung
und
Balkontüre Wohnzimmer ist geschlossen, bei Änderung
und
...
Und
Systemstart ist Normalbetrieb, bei Änderung
Dann
Fenster = 0
Sonst
Skript
var fenster_offen = 0;
if (dom.GetObject("Fenster Wohnzimmer").DPByHssDP("STATE").Value() != false) { fenster_offen = fenster_offen + 1 }
if (dom.GetObject("Balkontuere Wohnzimmer").DPByHssDP("STATE").Value() != 0) { fenster_offen = fenster_offen + 1 }
....
Meine Idee wäre gewesen, ähnlich diesem Skript die Sensoren aus dem Programm auszulesen und der Reihe nach abzufragen. Aber leider kapiere ich das Skript doch zu wenig, um es entsprechend umzubauen.
-
- Beiträge: 14257
- Registriert: 08.05.2013, 23:33
- System: Alternative CCU (auf Basis OCCU)
- Wohnort: Nordwürttemberg
- Hat sich bedankt: 597 Mal
- Danksagung erhalten: 1522 Mal
Re: Skript: Meldung bei offenen Fenstern
Nicht? Nun ja, das Edit des Eröffnungsposts spricht eine andere Sprache. Aber egal...
Nö, andersrum wird ein Schuh draus. Deine "Lösung" weist mehrere Probleme auf, auf die Du hingewiesen wurdest. Es ist ja nicht so, dass hier in schöner Regelmäßigkeit ähnliche Anwender wie Du auftauchen und Korrekturen oder Hinweise auf Problemstellen an ihren Vorstellungen als persönlichen Angriff verstehen. Und nein, hier will sich keiner beweisen. Es ist eben schlichtweg so, dass das System schon ein paar Tage existiert und die Möglichkeiten von Lösungen für Problemstellungen der Hausautomatisierung auch eher begrenzt sind. Somit kann man davon ausgehen, dass das vermeintlich ach so einmalige Problem schon von anderen gelöst wurde. So auch Deine Automationsaufgabe. Nur leider hast Du Dir die ungünstigste Variante der Lösungsansätze herausgesucht und wurdest auf Probleme (die z.T. auch sogar durch den Hersteller dokumentiert sind), durch Anwender, die schon etwas länger mit dem System befasst sind, durch Anwender hingewiesen, die das hier schon ein paar Tage länger machen. Nicht mehr und nicht weniger ist passiert. Deine Reaktion ist nur all zu bekannt. Und nein, mit dieser "Meinung" stehst Du nicht allein. Kommt immer wieder vor.
Nun ja, viele erwarten eine Silbertablettlösung. Da scheinst Du die Ausnahme zu sein. Du hattest für Dein Problem nur den ungünstigsten der bereits vorhandenen Lösungsansätze gewählt. Die CCU ist aus historischen Performancegründen ein ereignisgetriggertes System (was anderes macht bei eventgetriggertem bzw. zyklisch übertragenen Status auch wenig Sinn, da Aktoren und Sensoren in der Regel nicht abgefragt werden, sondern sie melden ihren Status und Werte zyklisch oder bei Änderungen selbst, worauf dann ggf. reagiert werden kann) und genau das gilt es bei der Programmierung zu berücksichtigen. Man kann nicht so einfach von Erfahrungen mit anderen Systemen auf das Verhalten einer CCU-Logik schließen. Die CCU arbeite zwar strikt logisch, aber mit einem ganz anderen Ansatz bezüglich des Triggerns und Abarbeitens von Automatisierungen. Diese dokumentierten Verhaltensweise gilt es zu berücksichtigen. Wer sich damit nicht auseinandersetzen will, rennt in Probleme oder weicht auf Scripte aus. Letzter Ansatz hat nur ein klitzekleines Problem. Den Highlander! Es gibt nur eine Scriptengine pro Benutzerkontext. Und wird gerade ein Script abgearbeitet, läuft kein anderes. Lang laufende Scripte oder welche, die wegen externer Kommunikation hängen (hier nicht der Fall), blockieren das ganze System. Der Hersteller hat seinen Grund, warum er Scripting grundsätzlich nicht supportet, obwohl er für bestimmte Zwecke (z.B. Datenhaltung bei Messaktorik) selbst welche benutzt.
Das ist Dein Ansatz??? Puhhhh... wird schwierig. Auf alle Fälle würde ich mit einem solchen Vorhaben unbedingt möglichst schnell den Moderator- oder besser noch Administratorstatus anstreben. Aber von einem kannst Du ausgehen. Der überwiegende Anteil an Automatisierungsaufgaben wurde hier im Forum schon thematisiert, auch wenn einige (gerade Einsteiger) der Meinung sind, dass ihre aktuelle individuelle Problemstellung absolut einmalig ist. Wenn man hier eine Weile mitliest, kommt einem vieles bekannt vor.
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
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
-
- Beiträge: 9786
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 710 Mal
- Danksagung erhalten: 1651 Mal
Re: Skript: Meldung bei offenen Fenstern
Das Skript holt sich die zu verarbeitenden Datenpunkte aus den im WebUI Programm aufgeführten Datenpunkte. Das mache ich in manchen Skripten auch so. Ich wollte mir sowieso mal eine universelle Routine basteln um durch alle Bedingungen eines Programm zu iterieren und die Datenpunkte einzusammeln. Keine Ahnung ob das in Deinem Fall hilft. Du müsstest dann noch prüfen ob das Objekt auch ein passender Sensor ist. Wenn ich da was zusammengebastelt habe, dann sage ich Bescheid. Henke ist vermutlich schneller mit sowas.
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 +++
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 +++
-
- Beiträge: 389
- Registriert: 19.06.2017, 09:24
- Hat sich bedankt: 20 Mal
- Danksagung erhalten: 67 Mal
Re: Skript: Meldung bei offenen Fenstern
The race is on
Aus Vorzeiten habe ich übrigens noch ein Skript, dass das Gewerk "Verschluss" nach Fensterkontakten und Drehgriffsensoren durchsucht. Den Code möchte ich nicht vorenthalten, müsste aber noch für HmIP erweitert werden.
Allerdings möchte ich nicht alle "Verschluss" Sensoren mit gerechnet haben und irgendwie war es mir auch zu umständlich, extra Gewerke für offene Fenster zählen, bei Abwesenheit melden, relevant für Hüllschutz, ... anzulegen. Außerdem müsste man ja trotzdem immer noch den Sensor als Trigger in die Programme aufnehmen und ins zugehörige Gewerk packen.
Code: Alles auswählen
string chname;
object obj;
integer offen = 0;
boolean debug = false;
if (!dom.GetObject("$this$")) {debug = true; }
foreach (chname, dom.GetObject("Verschluss").EnumUsedIDs()) {
obj = dom.GetObject (chname);
if (obj.HssType() == "ROTARY_HANDLE_SENSOR") {
if (obj.DPByHssDP("STATE").Value() != 0) {
offen = offen + 1;
if (debug) { WriteLine(obj.Name()); }
}
}
if (obj.HssType() == "SHUTTER_CONTACT") {
if (obj.DPByHssDP("STATE").Value() != false) {
offen = offen + 1;
if (debug) { WriteLine(obj.Name()); }
}
}
}
if (debug) { WriteLine("offen " # offen); }
dom.GetObject("Fenster_Offen").State(offen);
-
- Beiträge: 9786
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 710 Mal
- Danksagung erhalten: 1651 Mal
Re: Skript: Meldung bei offenen Fenstern
Genau. Der klassische Ansatz ist sich alle "Fenster" aus der Rega zusammenzusuchen.
Der andere Ansatz (den ich zum ersten Mal bewusst bei Henke gesehen habe) ist im Programm selber nachzusehen.
Das geht prinzipiell so:
Code: Alles auswählen
object oPrg = dom.GetObject("$this$");
object oSrc;
! Datenpunkt ermitteln
integer iCondition = 0; !Nummer der Condition
integer iSingle = 0; !Nummer der SingleCondition
object oCND; object oSCND;
object oRULE= oPrg.Rule ();
oCND=oRULE.RuleCondition(iCondition); ! Condition
oSCND=oCND.CndSingleCondition(iSingle);
oSrc = dom.GetObject(oSCND.LeftVal());
Da muss man dann halt sauber durch iterieren. Man weiß ja nicht in wieviele Conditions und SingleCondition der User das Programm Unterteilt hat. Mit dem SDV kannst Du Dir das bequem ansehen.
Und dann muss man - in deinem Fall - noch gucken, ob es Datenpunkte oder Systemvariable sind usw.
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 +++
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 +++
-
- Beiträge: 10681
- Registriert: 21.09.2012, 08:09
- System: CCU
- Wohnort: Stuttgart
- Hat sich bedankt: 330 Mal
- Danksagung erhalten: 505 Mal
Re: Skript: Meldung bei offenen Fenstern
Ich hab das übrigens über einen CUxD-Timer realisiert.
Und hier die beiden zugehörigen Programme am Beispiel des Badezimmers.
Programm 1 setzt den Timer. Programm 2 schickt die Meldung und setzt den Timer ggf. erneut. Und hier dann das zugehörte Skript, mit dem ich mir die Push-Nachricht schicken lasse. Das ist aktuell aber noch auf die Drehgriff-Sensoren beschränkt, weil ich nur diese verwende.
So sieht dann die Meldung aus.
Im Moment stimmen da aber die Timestamps irgendwie noch nicht. Muss der Sache noch mal auf den Grund gehen. Evtl. frage ich da den falschen Datenpunkt ab. Außerdem orientiert sich die Meldung immer am zuletzt betätigten Fenster eines Raums. Aber das dürfte kein so großes Problem sein, da sich ein Fenster ja in der Regel nicht von alleine öffnet (zumindest nicht mit den Drehgriff-Sensoren).
Und hier die beiden zugehörigen Programme am Beispiel des Badezimmers.
Programm 1 setzt den Timer. Programm 2 schickt die Meldung und setzt den Timer ggf. erneut. Und hier dann das zugehörte Skript, mit dem ich mir die Push-Nachricht schicken lasse. Das ist aktuell aber noch auf die Drehgriff-Sensoren beschränkt, weil ich nur diese verwende.
Code: Alles auswählen
! Meldung Bad Fenster steht offen
! Version 0.9, Autor: dtp
! +++++ Liste der zu berücksichtigenden Räume (mit "\t" trennen) +++++
string roomsList = "Bad";
! +++++ Verschluss-Gewerk +++++
string trade = "Verschluss";
! +++++ Namen der verwendeten Systemvariablen +++++
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushPrio = "CCU SV Push Prio"; ! gem. zPNS-xx, obligatorisch
string svPushoverSound = "CCU SV Pushover Sound"; ! gem. zPNS-Po, optional
! +++++ Name des zentralen Push-Nachrichten-Programms +++++
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch
! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################
! +++++ Deklaration weiterer Variablen +++++
string index; string list = ""; string message; string room; string sound; string closureName;
string durS; string durM; string durH;
object closure;
integer duration; integer prio = 0;
! +++++ Auslesen der Fenster- und Türenzustände und Erzeugen einer Liste +++++
foreach(index, dom.GetObject(ID_FUNCTIONS).Get(trade).EnumUsedIDs()){
if(dom.GetObject(index).IsTypeOf(OT_CHANNEL)){
closure = dom.GetObject(dom.GetObject(index).Device());
closureName = closure.Name();
foreach(room, roomsList){
if(closureName.Contains(room)){
if((closure.HssType() == "HM-Sec-RHS") || (closure.HssType() == "HmIP-SRH")){
if(dom.GetObject(index).DPByHssDP("STATE").Value() == 2){
prio = 1;
duration = currenttime.Format().ToTime().ToInteger() - (dom.GetObject(index).DPByHssDP("STATE")).Timestamp().ToInteger();
durS = duration.ToTime().Format("%S"); durM = duration.ToTime().Format("%M"); durH = duration.ToTime().Format("%H").ToInteger()-1;
list = list#"\n- <font color=orange>"#closureName#" seit "#durH#":"#durM#":"#durS#" Stunden offen.</font>";
}
elseif(dom.GetObject(index).DPByHssDP("STATE").Value() == 1){
duration = currenttime.Format().ToTime().ToInteger() - (dom.GetObject(index).DPByHssDP("STATE")).Timestamp().ToInteger();
durS = duration.ToTime().Format("%S"); durM = duration.ToTime().Format("%M"); durH = duration.ToTime().Format("%H").ToInteger()-1;
list = list#"\n- <font color=royalblue>"#closureName#" seit "#durH#":"#durM#":"#durS#" Stunden gekippt.</font>";
}
}
else{
if((dom.GetObject(index).DPByHssDP("STATE").Value() == 1) || (dom.GetObject(index).DPByHssDP("STATE").Value() == true)){
duration = currenttime.Format().ToTime().ToInteger() - (dom.GetObject(index).DPByHssDP("STATE")).Timestamp().ToInteger();
durS = duration.ToTime().Format("%S"); durM = duration.ToTime().Format("%M"); durH = duration.ToTime().Format("%H").ToInteger()-1;
list = list#"\n- <font color=orange>"#closureName#" seit "#durH#":"#durM#":"#durS#" Stunden offen.</font>";
}
}
}
}
}
}
! +++++ Setzen der Priorität für die Push-Nachricht +++++
dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio).State(prio);
! +++++ Sound für Pushover-Nachricht +++++
if(prio > 0){sound = "siren";} else{sound = "magelan";}
if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)).State(sound);}
! +++++ Erzeugen der Nachricht +++++
if(list != ""){
message = "Achtung!";
message = message#list;
! ----- zPNP ausführen -----
(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
(dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
}
}
Zuletzt geändert von dtp am 16.01.2023, 15:13, insgesamt 1-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.