Skript: Meldung bei offenen Fenstern

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Marks182
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

Beitrag von Marks182 » 13.01.2023, 07:17

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 :-)

MichaelN
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

Beitrag von MichaelN » 13.01.2023, 08:06

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 +++

Marks182
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

Beitrag von Marks182 » 13.01.2023, 08:34

MichaelN hat geschrieben:
13.01.2023, 08:06
Mafia?
Erfasst :lol: :wink:

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.

MichaelN
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

Beitrag von MichaelN » 13.01.2023, 08:47

Marks182 hat geschrieben:
13.01.2023, 08:34
kommt keiner konstruktiv mit einem wirklichen Verbesserungsansatz um die Ecke
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 +++

rentier-s
Beiträge: 389
Registriert: 19.06.2017, 09:24
Hat sich bedankt: 20 Mal
Danksagung erhalten: 67 Mal

Re: Skript: Meldung bei offenen Fenstern

Beitrag von rentier-s » 13.01.2023, 10:11

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.

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 }
    ....
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.

Xel66
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

Beitrag von Xel66 » 13.01.2023, 10:23

Marks182 hat geschrieben:
13.01.2023, 07:17
Hat mit beleidigt sein nichts zu tun...
Nicht? Nun ja, das Edit des Eröffnungsposts spricht eine andere Sprache. Aber egal...
Marks182 hat geschrieben:
13.01.2023, 08:34
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.
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.
Marks182 hat geschrieben:
13.01.2023, 07:17
...(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ß.
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.
Marks182 hat geschrieben:
13.01.2023, 07:17
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.
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

MichaelN
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

Beitrag von MichaelN » 13.01.2023, 10:30

rentier-s hat geschrieben:
13.01.2023, 10:11
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.
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 +++

rentier-s
Beiträge: 389
Registriert: 19.06.2017, 09:24
Hat sich bedankt: 20 Mal
Danksagung erhalten: 67 Mal

Re: Skript: Meldung bei offenen Fenstern

Beitrag von rentier-s » 13.01.2023, 11:47

MichaelN hat geschrieben:
13.01.2023, 10:30
Wenn ich da was zusammengebastelt habe, dann sage ich Bescheid. Henke ist vermutlich schneller mit sowas.
The race is on :D

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);

MichaelN
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

Beitrag von MichaelN » 13.01.2023, 13:11

rentier-s hat geschrieben:
13.01.2023, 11:47
Außerdem müsste man ja trotzdem immer noch den Sensor als Trigger in die Programme aufnehmen und ins zugehörige Gewerk packen.
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());
	
Am Ende liegt in oSrc das Objekt, das in der ersten Bedingung des Programms steht.
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 +++

dtp
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

Beitrag von dtp » 13.01.2023, 14:13

Ich hab das übrigens über einen CUxD-Timer realisiert.
2023-01-13_14h00_32.jpg
Und hier die beiden zugehörigen Programme am Beispiel des Badezimmers.

Programm 1 setzt den Timer.
2023-01-13_13h57_26.jpg
Programm 2 schickt die Meldung und setzt den Timer ggf. erneut.
2023-01-13_14h04_34.jpg
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();
  }
}
So sieht dann die Meldung aus.
2023-01-13 14-06-32.jpg
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).
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.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“