Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Benutzeravatar
Baxxy
Beiträge: 10827
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 608 Mal
Danksagung erhalten: 2225 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von Baxxy » 30.08.2021, 18:05

Nach kurzem drüberschauen sieht das für mich erstmal OK aus. Die SysVar "Fenster_Status" wird zwar bei jeder Fensterbewegung "aktualisiert", das sollte aber unkritisch sein weil das Push-Programm auf Änderung geht. Da es sich aber augenscheinlich wie "bei Aktualisierung" verhält würde ich das Push Prog mal löschen und neu anlegen.

Grüße
Baxxy

MichaelN
Beiträge: 9679
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von MichaelN » 30.08.2021, 18:31

Im Beitrag viewtopic.php?f=26&t=67681&start=10#p676862
hatte das Programm noch ein "Sonst, Wenn". Hast du das zwischenzeitlich gelöscht?
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 +++

Otti21
Beiträge: 48
Registriert: 22.07.2020, 21:48
System: CCU
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von Otti21 » 31.08.2021, 07:27

Guten Morgen, ich habe es jetzt hinbekommen, das eine Pushmeldung kommt und dass nur, wenn ein Fenster geöffnet wurde, nur leider ist es so, wenn ein Fenster offen steht und ich zusätzlich ein Fenster öffne, passiert nix.

Ich werde nachher, wenn ich Zeit habe, die Bilder reinstellen. Vielleicht habt ihr ja noch eine Idee, was man ändern sollte, damit jede Öffnung mitgeteilt wird.

MichaelN
Beiträge: 9679
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von MichaelN » 31.08.2021, 08:02

Dann musst Du entweder für jedes Fenster ein eigenes Programm schreiben oder Du musst die Anzahl offener Fenster feststellen und wenn ungleich der vorherigen Anzahl, dann Meldung.
IMHO gibt es hier aber irgendwo schon fertige Skripte für sowas. Das Rad muss ja nicht jeder neu erfinden.
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 +++

Otti21
Beiträge: 48
Registriert: 22.07.2020, 21:48
System: CCU
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von Otti21 » 31.08.2021, 19:25

Hi Michael, ja das wäre eine Idee. Du hast nicht zufällig einen Tipp wo man ein passendes Skript findet. Die typischen Internet Recherchen bzw. das Forum hat viele Einträge aber was passendes habe ich leider nicht gefunden.

Hier wie versprochen die Lösung zum vorherigen Problem.

Grüße

Robert
Dateianhänge
sysvar.png
sysvar.png (13.99 KiB) 616 mal betrachtet
push.jpg
Fenster_Geschlossen.jpg
Fenster_offen.jpg

Benutzeravatar
klana
Beiträge: 1099
Registriert: 08.02.2015, 08:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 66 Mal
Danksagung erhalten: 27 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von klana » 31.08.2021, 19:49

Hi,

ich habe das so gelöst:

Hiermit wird jedesmal eine Systemvariable mit dem letzten Fenster belegt (die kannst du dir dann per Message o.ä. schicken.
Ausserdem wir die Anzahl der offenen Fenster gezählt und gespeichert.

WebUI Programm
Bildschirmfoto 2021-08-31 um 19.43.31.jpg
Bildschirmfoto 2021-08-31 um 19.43.49.jpg

Hier das zugehörige Script:

Code: Alles auswählen

! Fenster - Namen des Programmauslöser Gerät und Zeit in Systemvariable schreiben
string list = "";
string zeit = "";
string devName = "";
object dp;
boolean choice = false;
var ch;
var dev;
var chType;
var devType;
var status;
string status_new = "";

integer countOffen = dom.GetObject("SV_CountFensterAuf").Value().ToInteger();

dp = dom.GetObject("$src$"); 
if (dp)
{
  ch      = dom.GetObject(dp.Channel()); 
  dev     = dom.GetObject(ch.Device());
  chType  = ch.HssType();
  devType = dev.HssType();
  devName = dev.Name().Substr(7);
  zeit = system.Date("%d.%m.%y - %H:%M:%S Uhr");

  if ( ( chType == "SHUTTER_CONTACT") || (chType =="TILT_SENSOR") )
  { 
    choice = true; 
    status = ch.DPByHssDP("STATE").Value(); 
    if (!status) { status_new = " zu "; countOffen = countOffen - 1;} else { status_new = " offen ";countOffen = countOffen + 1; }
  }

  if(chType.StartsWith("ROTARY_HANDLE"))
  {
    choice = true; 
    status = ch.DPByHssDP("STATE").Value(); 
    if (!status) { status_new = " zu "; countOffen = countOffen - 1;}
    if (status == 1 ){ status_new = " gekippt "; countOffen = countOffen + 1;}
    if (status == 2 ){ status_new = " offen "; countOffen = countOffen + 1;}
  }

  if (choice == true)
  {
    list = devName # " " # status_new # " " #zeit;
    dom.GetObject("SV_Last_Fenster").State(list); 
    dom.GetObject("SV_CountFensterAuf").State(countOffen); 
  } 
}

SV_Last_Fenster (Systemvariable als Zeichenkette definiert)
SV_CountFensterAuf (Systemvariable als Zahl definiert)



Gruß
Klana
Gruß Klana
Es ist nett, wichtig zu sein. Aber es ist wichtiger, nett zu sein.

Benutzeravatar
klana
Beiträge: 1099
Registriert: 08.02.2015, 08:37
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 66 Mal
Danksagung erhalten: 27 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von klana » 31.08.2021, 19:54

Hi,

ich schon wieder.... :mrgreen:

Wenn du per Script alle offenen Fenster ermitteln willst...hab ich mir auch zusammengeklau(b)t und angepasst... :D
Danke Alchy :!:

SV_PushMessage ist bei mir die Systemvariable deren Inhalt verschickt wird.

WebUI:
Bildschirmfoto 2021-08-31 um 19.53.57.jpg
Passendes Script

Code: Alles auswählen

! alle Fenstersensoren / HMW-Sen-SC-12-DR / Winmatic / Keymatic / Funk-Neigungssensor in einem bestimmten Gewerk/ Favoriten u.a. durchsuchen
! und Ausgabe in Variable oder per pushover, telegram oder per Mail oder Ansage Home24 Mediaplayer
! v1.42 (c) by Alchy
! https://homematic-forum.de/forum/viewtopic.php?f=26&t=25517&p=301186#p301186

! +++++++++++ Setup Script ++++++++++++++++
string ONLYOPEN= "yes"; ! if yes pushed only the opened sensors
string FUNCTIONS = "Verschluss"; ! which function / room / favorites
boolean DEBUG = false; ! true/false zusaetzliche Ausgabe des Scriptes auf dem Monitor


!+++++++ SETUP SYSTEMVARIABLE ++++++
! 1. VOR Benutzung Systemvariable vom Typ Zeichenkette in CCU anlegen,
var USE_SYSVAR = "yes"; ! yes to save the output to a sysvar
var USE_SYSCOUNT = "yes"; ! yes to save the output to a sysvar


var SYSVAR_NAME = "SV_PushMessage"; ! name of the sysvar
var SYSVAR_COUNTER = "SV_CountFensterAuf"; ! name of the countvar

!++++++ DONT TOUCH BEHIND THIS LINE +++++++++
string i;
string slist;
integer count = 0;
var sec=dom.GetObject(FUNCTIONS);
if ( (DEBUG == true) && (!sec) ){ WriteLine(" Gewerk nicht vorhanden");quit;}

foreach(i,sec.EnumUsedIDs()) 
{
  string status_new = "unbekannt";
  boolean choice = false;
  boolean status = false;
  var since;
  var ch = dom.GetObject(i);
  
  if ( ch.IsTypeOf(OT_CHANNEL) ) 
  {
    var dev = dom.GetObject(ch.Device());
    var chType = ch.HssType();
    var devType = dev.HssType();
    string room; string id; 
  
    foreach(id, ch.ChnRoom()) 
      {   
        var roomi = dom.GetObject(id);   room = room # " "# roomi.Name() ; 
      } 

      if ( ( chType == "SHUTTER_CONTACT") || (chType =="TILT_SENSOR") )
      { 
        choice = true; var status = ch.DPByHssDP("STATE").Value(); 
        if (!status) { status_new = " zu "; }else{ status_new = " offen "; }
      }

      if(chType.StartsWith("ROTARY_HANDLE"))
      {
        choice = true; var status = ch.DPByHssDP("STATE").Value(); 
        if (!status) { status_new = " zu ";}
        if (status == 1 ){ status_new = " gekippt "; }
        if (status == 2 ){ status_new = " offen "; }
      }
    
      if ( ( devType == "HMW-Sen-SC-12-DR") && ( chType == "SENSOR")  ) 
      { 
        choice = true; var status = ch.DPByHssDP("SENSOR").Value(); 
        if (status == 0 ) { status_new = " zu ";}
        if (status == 1 ) { status_new = " offen "; }
      }
    
      if ( ( devType.StartsWith("HM-Sec-Win")) && ( chType == "WINMATIC")  ) 
      { 
       choice = true; var status = ch.DPByHssDP("LEVEL").Value(); 
       if (ch.DPByHssDP("LEVEL").Value() == -0.005 ){status_new = " verriegelt ";}
       if (ch.DPByHssDP("LEVEL").Value() == 0.0 ){status_new = " zu ";}
       if (ch.DPByHssDP("LEVEL").Value() >= 0.1 ){status_new = " offen ";}
      }
    
      if ( ( devType.StartsWith("HM-Sec-Key")) && ( chType == "KEYMATIC")  ) 
      { 
        choice = true; var status = ch.DPByHssDP("STATE").Value(); 
        if (!status) { status_new = " zu "; }else{ status_new = " offen "; }
      }
    
      if (choice)
      {
        var since = ch.LastDPActionTime().ToString("%d.%m.%y %H:%M:%S Uhr");
        if (since == "01.01.70 01:00:00 Uhr") {since = " unbekannt ";}
        if (status) 
        { 
          count = count +1; 
        }
        
!  Hier wird kein Raum und keine Uhrzeit ausgegeben
!        if (ONLYOPEN == "yes")  
!        {
!          if (status) { slist=slist # dev.Name() #" - Status: " # status_new #"\n"; }
!        } 
!        else 
!        { 
!          slist=slist # dev.Name() #" - Status: " # status_new #"\n"; 
!        }
        
        
!  Hier wird  Raum und Uhrzeit ausgegeben
        
        if (ONLYOPEN == "yes")  
        {
          if (status) 
          { 
! Ohne Raum nur mit Zeit
            slist=slist # dev.Name() #" - Status: " # status_new #" seit: "# since #"\n"; 
!           slist=slist # dev.Name() #" - Status: " # status_new #" - im Raum: "#room #" - seit: "  # since #"\n"; 
          }
        } 
        else 
        { 

! Ohne Raum nur mit Zeit
          slist=slist # dev.Name() #" - Status: " # status_new #" seit: "# since #"\n"; 
!         slist=slist # dev.Name() #" - Status: " # status_new #" - im Raum: "#room #" - seit: "  # since #"\n"; 
        }
      }
  }
}


slist = count #" Fenster geöffnet\n" #slist;

if ( DEBUG) { WriteLine ("slist\n"#slist);}
! if ( DEBUG) { WriteLine ("\nslist UTF8 \n"#slist.ToUTF8());}
if ( DEBUG) { WriteLine ("count\n"#count);}




if ( USE_SYSCOUNT == "yes") {dom.GetObject(SYSVAR_COUNTER).State(count); }
if ( USE_SYSVAR == "yes"){ dom.GetObject(SYSVAR_NAME).State(slist); }



Ergebnis sieht dann so aus:
Bildschirmfoto 2021-08-31 um 19.58.33.jpg
Gruß Klana
Es ist nett, wichtig zu sein. Aber es ist wichtiger, nett zu sein.

Otti21
Beiträge: 48
Registriert: 22.07.2020, 21:48
System: CCU
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von Otti21 » 01.09.2021, 10:06

Ihr seit super, vielen lieben Dank. Dann werde ich mal ran machen und mich ausprobieren😁👍

Joee
Beiträge: 17
Registriert: 06.11.2023, 14:49
System: CCU
Hat sich bedankt: 2 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von Joee » 10.11.2023, 19:49

Hallo leute,

ich habe euer Script im Einsatz. Ersteinmal vielen Dank an alle, die an diesem Script mitgewirkt haben. Ich habe leider ein kleines Problem: Es werden nicht alle offenen Fenster, die dem Gewerk "Verschluss" zugeordnet sind, angezeigt. Schaue ich im CCU3 Webgui die Gruppe Verschluss an, werden alle Fenster aufgeführt, die die offen sind werden auch als offen markiert. Ich nutze die HmIP-SWDO optischen Fensterkontakte. Hat vielleicht jemand eine Idee, an was das liegen kann?

klana hat geschrieben:
31.08.2021, 19:54

Passendes Script

Code: Alles auswählen

! alle Fenstersensoren / HMW-Sen-SC-12-DR / Winmatic / Keymatic / Funk-Neigungssensor in einem bestimmten Gewerk/ Favoriten u.a. durchsuchen
! und Ausgabe in Variable oder per pushover, telegram oder per Mail oder Ansage Home24 Mediaplayer
! v1.42 (c) by Alchy
! https://homematic-forum.de/forum/viewtopic.php?f=26&t=25517&p=301186#p301186

! +++++++++++ Setup Script ++++++++++++++++
string ONLYOPEN= "yes"; ! if yes pushed only the opened sensors
string FUNCTIONS = "Verschluss"; ! which function / room / favorites
boolean DEBUG = false; ! true/false zusaetzliche Ausgabe des Scriptes auf dem Monitor


!+++++++ SETUP SYSTEMVARIABLE ++++++
! 1. VOR Benutzung Systemvariable vom Typ Zeichenkette in CCU anlegen,
var USE_SYSVAR = "yes"; ! yes to save the output to a sysvar
var USE_SYSCOUNT = "yes"; ! yes to save the output to a sysvar


var SYSVAR_NAME = "SV_PushMessage"; ! name of the sysvar
var SYSVAR_COUNTER = "SV_CountFensterAuf"; ! name of the countvar

!++++++ DONT TOUCH BEHIND THIS LINE +++++++++
string i;
string slist;
integer count = 0;
var sec=dom.GetObject(FUNCTIONS);
if ( (DEBUG == true) && (!sec) ){ WriteLine(" Gewerk nicht vorhanden");quit;}

foreach(i,sec.EnumUsedIDs()) 
{
  string status_new = "unbekannt";
  boolean choice = false;
  boolean status = false;
  var since;
  var ch = dom.GetObject(i);
  
  if ( ch.IsTypeOf(OT_CHANNEL) ) 
  {
    var dev = dom.GetObject(ch.Device());
    var chType = ch.HssType();
    var devType = dev.HssType();
    string room; string id; 
  
    foreach(id, ch.ChnRoom()) 
      {   
        var roomi = dom.GetObject(id);   room = room # " "# roomi.Name() ; 
      } 

      if ( ( chType == "SHUTTER_CONTACT") || (chType =="TILT_SENSOR") )
      { 
        choice = true; var status = ch.DPByHssDP("STATE").Value(); 
        if (!status) { status_new = " zu "; }else{ status_new = " offen "; }
      }

      if(chType.StartsWith("ROTARY_HANDLE"))
      {
        choice = true; var status = ch.DPByHssDP("STATE").Value(); 
        if (!status) { status_new = " zu ";}
        if (status == 1 ){ status_new = " gekippt "; }
        if (status == 2 ){ status_new = " offen "; }
      }
    
      if ( ( devType == "HMW-Sen-SC-12-DR") && ( chType == "SENSOR")  ) 
      { 
        choice = true; var status = ch.DPByHssDP("SENSOR").Value(); 
        if (status == 0 ) { status_new = " zu ";}
        if (status == 1 ) { status_new = " offen "; }
      }
    
      if ( ( devType.StartsWith("HM-Sec-Win")) && ( chType == "WINMATIC")  ) 
      { 
       choice = true; var status = ch.DPByHssDP("LEVEL").Value(); 
       if (ch.DPByHssDP("LEVEL").Value() == -0.005 ){status_new = " verriegelt ";}
       if (ch.DPByHssDP("LEVEL").Value() == 0.0 ){status_new = " zu ";}
       if (ch.DPByHssDP("LEVEL").Value() >= 0.1 ){status_new = " offen ";}
      }
    
      if ( ( devType.StartsWith("HM-Sec-Key")) && ( chType == "KEYMATIC")  ) 
      { 
        choice = true; var status = ch.DPByHssDP("STATE").Value(); 
        if (!status) { status_new = " zu "; }else{ status_new = " offen "; }
      }
    
      if (choice)
      {
        var since = ch.LastDPActionTime().ToString("%d.%m.%y %H:%M:%S Uhr");
        if (since == "01.01.70 01:00:00 Uhr") {since = " unbekannt ";}
        if (status) 
        { 
          count = count +1; 
        }
        
!  Hier wird kein Raum und keine Uhrzeit ausgegeben
!        if (ONLYOPEN == "yes")  
!        {
!          if (status) { slist=slist # dev.Name() #" - Status: " # status_new #"\n"; }
!        } 
!        else 
!        { 
!          slist=slist # dev.Name() #" - Status: " # status_new #"\n"; 
!        }
        
        
!  Hier wird  Raum und Uhrzeit ausgegeben
        
        if (ONLYOPEN == "yes")  
        {
          if (status) 
          { 
! Ohne Raum nur mit Zeit
            slist=slist # dev.Name() #" - Status: " # status_new #" seit: "# since #"\n"; 
!           slist=slist # dev.Name() #" - Status: " # status_new #" - im Raum: "#room #" - seit: "  # since #"\n"; 
          }
        } 
        else 
        { 

! Ohne Raum nur mit Zeit
          slist=slist # dev.Name() #" - Status: " # status_new #" seit: "# since #"\n"; 
!         slist=slist # dev.Name() #" - Status: " # status_new #" - im Raum: "#room #" - seit: "  # since #"\n"; 
        }
      }
  }
}


slist = count #" Fenster geöffnet\n" #slist;

if ( DEBUG) { WriteLine ("slist\n"#slist);}
! if ( DEBUG) { WriteLine ("\nslist UTF8 \n"#slist.ToUTF8());}
if ( DEBUG) { WriteLine ("count\n"#count);}




if ( USE_SYSCOUNT == "yes") {dom.GetObject(SYSVAR_COUNTER).State(count); }
if ( USE_SYSVAR == "yes"){ dom.GetObject(SYSVAR_NAME).State(slist); }



Ergebnis sieht dann so aus:

Bildschirmfoto 2021-08-31 um 19.58.33.jpg

Benutzeravatar
Baxxy
Beiträge: 10827
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 608 Mal
Danksagung erhalten: 2225 Mal

Re: Skript zur Anzeige offener/geschlossener Fenster - Systemvariable ändert sich nicht bei mehreren Bedingungen

Beitrag von Baxxy » 11.11.2023, 17:12

Joee hat geschrieben:
10.11.2023, 19:49
eine Idee,
SWDO's sollten registriert werden.

Setze doch mal im Script Header:

Code: Alles auswählen

! +++++++++++ Setup Script ++++++++++++++++
string ONLYOPEN= "no"; ! if yes pushed only the opened sensors
string FUNCTIONS = "Verschluss"; ! which function / room / favorites
boolean DEBUG = true; ! true/false zusaetzliche Ausgabe des Scriptes auf dem Monitor
Dann sollten (ausgeführt im "Script testen") alle Fenstersensoren samt Status aufgelistet werden.

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“