Verknüpfung Fensterkontakt und Rolladenaktor über script

HMIP lokale Installation

Moderator: Co-Administratoren

Antworten
Anvaar
Beiträge: 7
Registriert: 24.09.2020, 16:24
System: CCU
Hat sich bedankt: 4 Mal

Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von Anvaar » 03.09.2023, 21:54

Hallo zusammen,
erstmal vielen Dank an die vielen aktiven Helfer, mit deren Hilfe ich allein durch Forumssuche und Beispiele schon viele Problem lösen konnte.
Ich habe mir eine Rolladensteuerung inklusive Beschattungsssteuerung programmiert, die ich jetzt noch etwas verfeinern möchte. Dazu möchte ich wissen, welches Fenster offen ist, da dann abends die Rolladen nicht geschlossen werden sollen (wegen Lüftung). Da es aber Räume mit mehren Fenstern gibt, ist die Auswahl des passenden Fensterkontakts über den Raum nicht möglich. Also das Ziel ist herauszufinden, welcher Fensterkontakt und welches Rollo zu welchem Fenster gehören. Meine Fensterkontakte sind nach dem Schema "Fenster Arbeitszimmer vorn:1" benannt (hier also Kanal 1 des entsprechenden Fensterkontakts). Das Rollo dazu heisst: "Rolladen Arbeitszimmer vorn:1". Alle Rolladenaktoren gehören zum Gewerk "Rolladen", die übere eine Schleife abgefragt werden, um je nach Variable die betroffenen Rolladen zu öffen, zu schliessen oder in Beschattungsstellung zu bringen. Die Frage ist, ob es eine elegante Lösung für das genannte Problem gibt. Ich hatte schon daran gedacht die Fensterkontakte und die Aktoren gleich zu benennen (also "Fenster Arbeitszimmer vorn:1"), aber soweit ich das bisher verstanden habe, ist das wohl keine so brilliante Idee, da es keine doppelte Namen geben sollte.
Vielleicht sollte ich noch erwähnen, dass ich kein gelernter Informatiker bin, sondern reiner Autodidakt. Also seht es mir bitte nach, wenn das script für die echten cracks etwas unbeholfen ist.

Anbei der aktuelle Arbeitsstand des scriptes:

Code: Alles auswählen

! Script zum setzen der verschiedenen variablen, die für Beschattung benötigt werden
! Skript wird durch Timer getriggert,

! Variablen initialisieren
boolean DEBUG = false; ! true/false zusaetzliche Ausgabe des Scriptes auf dem Monitor und im Syslog

string sysvarOut = "SYS:Log";
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("Debug True") };

boolean rollo_morgens;
boolean rollo_abends;
boolean rollo_schatten_Garten;
boolean rollo_schatten_Seite;
boolean rollo_schatten_Strasse;
boolean rollo_beschattung;
!boolean rollo_variable_current_state;
!integer rollo_ankleidezimmer_stand;

integer aussenTemp = dom.GetObject("HmIP-RF.xxxxxxxxx:1.ACTUAL_TEMPERATURE").Value(); !aktuelle Aussentemperatur
if ( DEBUG) { WriteLine ("Aussentemperatur: " # aussenTemp ) };
integer helligkeit = dom.GetObject("HmIP-RF.xxxxxxxx:1.ILLUMINATION").Value(); !aktuelle Helligkeit
!- helligkeit = 100;
if ( DEBUG) { WriteLine ("Helligkeit: " # helligkeit ) };
integer elevation = system.SunAltitude().Round(2);
if ( DEBUG) { WriteLine ("Sonnenstand elevation: " # elevation ) }; !Sonnenhöhe
integer azimut =system.SunAzimuth().Round(2);
if ( DEBUG) { WriteLine ("Sonnenstand azimut: " # azimut ) };  !Sonnenstand (Gradzahl)
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Helligkeit: " # helligkeit # " Aussentemperatur: " # aussenTemp # " Sonnenstand elevation: " # elevation # " Sonnenstand azimut: " # azimut ) ;

!- !- globale hoch / runter variablen setzen
!- if(system.Date("%H:%M") > "10:00") {
!- 	boolean rollo_hoch = true;
!- }

if(helligkeit > 200) {
	rollo_morgens = true;
    rollo_abends = false;
    if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: (helligkeit: " # helligkeit # "->rollo_morgens = true") };
}
if ( DEBUG) { WriteLine ("roll_morgen: " # rollo_morgens ) };

!- bei Dämmerung Rollos herunterfahren
if(helligkeit < 130) {
	rollo_abends = true;
    rollo_morgens = false;
    if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: (helligkeit < 130) ->rollo_abends = true") };
}
if ( DEBUG) { WriteLine ("rollo_abends: " # rollo_abends ) };

!- Festlegen, ob Beschattung notwendig ist
if ( (aussenTemp > 20) && (helligkeit > 4000)  ) {
	rollo_beschattung = true;
} else {
	rollo_beschattung = false;
}

!- Beschattung Garten
if((azimut > 60) && (azimut < 180) && (elevation > 10) && (rollo_beschattung) ) {
	rollo_schatten_Garten = true;
    if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Garten = true") };
} else {
	rollo_schatten_Garten = false;
    if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Garten = false") };
}
if ( DEBUG) { WriteLine ("rollo_schatten_Garten: " # rollo_schatten_Garten ) };

!- Beschattung Seite
if((azimut > 100) && (azimut < 240) && (elevation > 10) && (rollo_beschattung) ) {
	rollo_schatten_Seite = true;
    if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Seite = true") };
} else {
	rollo_schatten_Seite = false;
    if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Seite = false") };
}
if ( DEBUG) { WriteLine ("rollo_schatten_Seite: " # rollo_schatten_Seite ) };

!- Beschattung Strasse
if((azimut > 160) && (azimut < 350) && (elevation > 10) && (rollo_beschattung) ) {
	rollo_schatten_Strasse = true;
    if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Strasse = true") };
} else {
	rollo_schatten_Strasse = false;
    if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Strasse = false") };
}
if ( DEBUG) { WriteLine ("rollo_schatten_Strasse: " # rollo_schatten_Strasse ) };



!- hier fangen die eigentlichen Rollos an
!- Behanghöhe ist ein wert zwischen 0 (ganz zu) und 1 (ganz auf)
!- 0.25 wäre z.b ein viertel herunter
!- Behanghöse lesen über Kanal 3, setzen über Kanal 4

!- Rollos sollen nur fahren, wenn sich der Wert der Variable verändert hat
!- ansonsten wurde manuell betätigt und erst bei der nächsten Änderung soll gefahren werden.

!- aktuellen Stand der Rollos (sollzustand) holen um mit Ist zu vergleichen und manuelle Änderung zu detektieren
!- integer value_rollo_ankleidezimmer = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Roll_Ankleidezimmer").Value();
!- integer last_value_rollo_ankleidezimmer = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Roll_Ankleidezimmer").LastValue();

var rollo = dom.GetObject("Rolladen");
string rolloID;

foreach(rolloID, rollo.EnumUsedIDs())  {
	! Gerät zum Kanal holen
	var device = dom.GetObject(dom.GetObject(rolloID).Device());
	! Kanal 4 vom Gerät holen
	var channel = dom.GetObject(rolloID);
	! Datenpunkt mit gesuchter Information vom Kanal
	var dp  = channel.DPByHssDP("LEVEL");
    ! Name des Gerätes
    var rollo_name = device.Name();
    string sysvar = "Behang_" # rollo_name;
    if (! dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar)) {
  	    if ( DEBUG) { WriteLine ("Systemvariable nicht definiert: " # sysvar) };
    	dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("Systemvariable nicht definiert: " # sysvar);
        continue;
    }
    integer last_value = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).LastValue();
    integer current_value = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).Value();

    ! Raum des Gerätes
    var RaumNamen = "";
    string rid;
    foreach(rid, channel.ChnRoom())  {
            var Raum = dom.GetObject(rid);
            RaumNamen = RaumNamen # Raum.Name();
     }

    if ( DEBUG) { WriteLine ("device: " # device) };
    if ( DEBUG) { WriteLine ("kanal: " # channel) };
    if ( DEBUG) { WriteLine ("datenpunkt: " # dp) };
    if ( DEBUG) { WriteLine ("Name: " # rollo_name) };
    if ( DEBUG) { WriteLine ("Raum: " # Raum) };
    if ( DEBUG) { WriteLine ("Raum des Kanals: " # RaumNamen) };
    if ( DEBUG) { WriteLine ("SystemVariable Behang: " # sysvar) };
	if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("ForEachRollo: " # rollo_name # " current_value: " # current_value # " last_value: " # last_value # " datenpunkt: " # dp # " Raum: " # Raum ) };
    if ( DEBUG) { WriteLine ("rollo: " # rollo_name) };

  if (rollo_morgens) {
      !-if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo morgens = true") };
      integer behang = 1; ! setze value zum öffnen
       ! wenn behang <> last value, wurde der Rolladen manuell geändert -> nicht fahren
      if  ( (behang <>  current_value) && (!rollo_beschattung) ) {
        	if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("RolloName " # rollo_name # " Variablen: behang " # behang # " current_value: " # current_value # " rollo_beschattung: " # rollo_beschattung ) };
			!- Systemvariable setzen
			dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
    	  	!- Wert wurde gerade geändert, Rolladen fahren
          	dp.State(behang);
          	if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_morgens " # rollo_name # " rollo_beschattung " # rollo_beschattung # " Wert behang hat sich geändert  ->rollo sollte aufgehen") };
      } else {
          if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_morgens " # rollo_name # " Wert behang hat sich NICHT geändert  ->bleibt wie es ist") };
      }
   }

  if (rollo_abends) {
	  !-if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo abends = true") };
      integer behang = 0; ! setze value zum schliessen
      !- rollo nur fahren, wenn nicht zum lüften geöffnet
!- hier muss nioch der Raum ausgelesen werden und der passende Fensterkontakt
      if  ((behang <>  current_value) && (dom.GetObject("HmIP-RF.00109A49A44C1C:1.STATE").Value() == 0)) {
	      !- Systemvariable setzen
		  dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
    	  !- Wert wurde gerade geändert, Rolladen fahren
          dp.State(behang);
          if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_abends " # rollo_name # " Wert behang hat sich geändert Und Fenster ist nicht offen ->Rollo geht zu") };
      } else {
			if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_abends " # rollo_name # " Wert behang hat sich NICHT geändert  ->bleibt wie es ist") };
      }
  }

  if (rollo_schatten_Garten) {
  		!-if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Garten = true") };
  !	dom.GetObject(ID_SYSTEM_VARIABLES).Get("Roll_Schlafzimmer_links").State("Schatten");
  !	dom.GetObject(ID_SYSTEM_VARIABLES).Get("Roll_Schlafzimmer_rechts").State("Schatten");
  }

  if (rollo_schatten_Seite && (rollo_name == "Rolladen_Arbeitszimmer_links") ) {
  		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Seite: " # rollo_schatten_Seite ) };
		integer behang = 0.25;
      if  (behang <>  current_value) {
		!- Systemvariable setzen
		dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
		!- Wert wurde gerade geändert, Rolladen fahren
		dp.State(behang);
		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Seite " # rollo_name # " Wert behang hat sich geändert Und Fenster ist nicht offen ->Fenster geht zu") };
      } else {
		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Seite " # rollo_name # " Wert behang hat sich NICHT geändert  ->bleibt wie es ist") };
      }
  } elseif ((!rollo_schatten_Seite) && (rollo_name == "Rolladen_Arbeitszimmer_links") ) {
  		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Seite: " # rollo_schatten_Seite ) };
		integer behang = 1;
      if  (behang <>  current_value) {
		!- Systemvariable setzen
		dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
		!- Wert wurde gerade geändert, Rolladen fahren
		dp.State(behang);
		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Seite " # rollo_name # " Wert behang hat sich geändert") };
      } else {
		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Seite " # rollo_name # " Wert behang hat sich NICHT geändert  ->bleibt wie es ist") };
      }
  }

  if (rollo_schatten_Strasse && ((rollo_name == "Rolladen_Arbeitszimmer_vorn") || (rollo_name == "Rolladen_Ankleidezimmer") )) {
  		!-if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Strasse = true") };
		integer behang = 0.25;
      if  (behang <>  current_value) {
	        !- Systemvariable setzen
	        dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
	        if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("Rollo: " # rollo_name # " sysvar_behang: " # behang # " sysvar_lastValue: " # last_value # " current_value: " # dp.Value() ) };
    	  !- Wert wurde gerade geändert, Rolladen fahren
          dp.State(behang);
          if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Strasse " # rollo_name # " Wert behang hat sich geändert Und Fenster ist nicht offen ->Fenster geht zu") };
      } else {
       		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Strasse " # rollo_name # " Wert behang hat sich NICHT geändert  ->bleibt wie es ist") };
      }
  } elseif ( (!rollo_schatten_Strasse) && ((rollo_name == "Rolladen_Arbeitszimmer_vorn") || (rollo_name == "Rolladen_Ankleidezimmer") )) {
  		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Strasse: " # rollo_schatten_Strasse ) };
		integer behang = 1;
      if  (behang <>  current_value) {
		!- Systemvariable setzen
		dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
		!- Wert wurde gerade geändert, Rolladen fahren
		dp.State(behang);
		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Strasse " # rollo_name # " Wert behang hat sich geändert") };
      } else {
		if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Strasse " # rollo_name # " Wert behang hat sich NICHT geändert  ->bleibt wie es ist") };
      }
  }
}
!-- Ende


MichaelN
Beiträge: 9771
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 707 Mal
Danksagung erhalten: 1647 Mal

Re: Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von MichaelN » 03.09.2023, 22:01

Stichwort virtuelle Kanäle
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 +++

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

Re: Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von Baxxy » 03.09.2023, 22:39

Schönes Scriptchen. :)

Mein Vorschlag (kommt in den Beginn der foreach-Schleife):

Code: Alles auswählen

foreach(rolloID, rollo.EnumUsedIDs())  {
        ! Gerät zum Kanal holen
	var device = dom.GetObject(dom.GetObject(rolloID).Device());
	! Kanal 4 vom Gerät holen
	var channel = dom.GetObject(rolloID);
	! Datenpunkt mit gesuchter Information vom Kanal
	var dp  = channel.DPByHssDP("LEVEL");
        ! Name des Gerätes
        var rollo_name = device.Name();
        string sysvar = "Behang_" # rollo_name;
        ! wir bauen uns den passenden Fensterkontakt Namen (für Kanal:1) aus dem jeweiligen Rollo Namen
	string fenster_name = "Fenster"#rollo_name.LTrim("Rolladen")#":1";
	! wir holen uns den Status des Fensterkontaktes
	integer fenster_status = channels.Get ("fenster_name").DPByHssDP ("STATE").Value();
Den "fenster_status" kannst du dann in die jeweiligen "Setz-Blöcke" einbeziehen.

Funktioniert natürlich nur dank deiner Strikten Benamung.

Der SDV bemeckert deine Semikolons...
Die kommen immer ans Ende einer Befehlszeile, also vor die schließende geschweifte Klammer... nicht dahinter.
So nicht:

Code: Alles auswählen

if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("Debug True") };
So ja:

Code: Alles auswählen

if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("Debug True"); }
:wink:

Benutzeravatar
Roland M.
Beiträge: 9858
Registriert: 08.12.2012, 15:53
System: CCU
Wohnort: Graz, Österreich
Hat sich bedankt: 255 Mal
Danksagung erhalten: 1406 Mal

Re: Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von Roland M. » 03.09.2023, 22:45

Hallo!

Ich habe das über Systemvariablen gelöst.
Im ersten Schritt werden pro Raum die Zustände zusammengefasst nach dem Muster

WENN Fenster Wohnzimmer links = offen
ODER Fenster Wohnzimmer rechts = offen
DANN Status Fenster Wohnzimmer = offen
SONSTWENN Fenster Wohnzimmer links = gekippt
ODER Fenster Wohnzimmer rechts = gekippt
DANN Status Fenster Wohnzimmer = gekippt
SONST Status Fenster Wohnzimmer = geschlossen

(Spezialität am Rande: ich habe noch den Zustand "unbekannt", den ich beim Neustart der CCU setze und so bis zur zyklischen Statusmeldung der Fensterkontakte bzw. dem ersten Betätigen auch noch den möglicherweise falschen Defaultwert "geschlossen" abfange).

Diese Systemvariablen fasse ich dann nach gleichem Muster auf Stockwerke und schließlich auf das gesamte Haus zusammen.

Die Zusammenfassung auf den Raum genügt mir, wenn ich noch ein Fenster schließen muss, dann genügt mir die Mitteilung, in welchem Raum ich gehen muss. Ob es nun das linke oder rechte Fenster ist, sehe ich ja vor Ort.

Das System lässt sich auch gut auf das Licht (aus, Automatik, ein) oder Bewegungsmelder (Anwesenheit) übertragen und kommt ohne eine Zeile Script aus! ;)


Roland
Zur leichteren Hilfestellung bitte unbedingt beachten:
  • Bezeichnung (HM-... bzw. HmIP-...) der betroffenen Geräte angeben (nicht Artikelnummer)
  • Kurzbeschreibung des Soll-Zustandes (Was soll erreicht werden?)
  • Kurzbeschreibung des Ist-Zustandes (Was funktioniert nicht?)
  • Fehlermeldungen genau abschreiben, besser noch...
  • Screenshots von Programmen, Geräteeinstellungen und Fehlermeldungen (direkt als jpg/png) einstellen!

-----------------------------------------------------------------------
1. CCU2 mit ~100 Geräten (in Umstellung auf RaspberryMatic-OVA auf Proxmox-Server)
2. CCU2 per VPN mit ~50 Geräten (geplant: RaspberryMatic auf Charly)
3. CCU2 per VPN mit ~40 Geräten (geplant: RaspberryMatic auf CCU3)
CCU1, Test-CCU2, Raspi 1 mit kleinem Funkmodul, RaspberryMatic als VM unter Proxmox, Access Point,...

Anvaar
Beiträge: 7
Registriert: 24.09.2020, 16:24
System: CCU
Hat sich bedankt: 4 Mal

Re: Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von Anvaar » 03.09.2023, 23:04

MichaelN hat geschrieben:
03.09.2023, 22:01
Stichwort virtuelle Kanäle
Danke erstmal für den Hinweis, aber ich hab jetzt mal kurz die Forumssuche zu dem Thema befragt und muss gestehen, dass ich vermutlich ein paar Tage brauche, um bei dem Thema durchzusteigen. Und ich bin mir nicht wirklich sicher, ob das mein Problem löst ...
Roland M. hat geschrieben:
03.09.2023, 22:45
Ich habe das über Systemvariablen gelöst.
Danke, an eigene Systemvariablen hatte ich auch schon gedacht. Das wäre mein Fallback geswesen, wenn es keine elegantere Lösung gibt. Ich wollte halt nur nicht für jedes Fenster eine eigene Variable anlegen. Und eben auch nichts manuell machen, sonden Automatisieren. Ein skript, welches mich beim Verlassen des Hauses auf geöffnete Fenster oder Türen hinweist hab ich schon, nur der Link zwischen den einzelnen Rollos und Fensterkontakten fehlte mir. Trotzdem eine gute Methode und der Spezialhinweis ist auch ein guter tipp.
Baxxy hat geschrieben:
03.09.2023, 22:39
Schönes Scriptchen. :)
Vielen Dank :-) Da sind einige der Poweruser hier quasi Pate ;-) (sprich ich habe Teilscripte entsprechend adaptiert ..)

Diese Art von eleganter Lösung schwebte mir übrigens vor :-) Vielen Dank, aber da hab ich den Wald vor lauter Bäumen nicht gesehen. Stringmanipulation ist ja eigentlich ein Standard bei Skripten ....
Und danke auch für den Hinweis auf das Semikolon an der falschen Stelle. Auch nur kopiert aber den Fehler nicht gesehen. Nur gewundert, warum der SDV da immer meckert :lol:

Anvaar
Beiträge: 7
Registriert: 24.09.2020, 16:24
System: CCU
Hat sich bedankt: 4 Mal

Re: Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von Anvaar » 04.09.2023, 22:31

Baxxy hat geschrieben:
03.09.2023, 22:39

Code: Alles auswählen

        ! wir bauen uns den passenden Fensterkontakt Namen (für Kanal:1) aus dem jeweiligen Rollo Namen
	string fenster_name = "Fenster"#rollo_name.LTrim("Rolladen")#":1";
	! wir holen uns den Status des Fensterkontaktes
	integer fenster_status = channels.Get ("fenster_name").DPByHssDP ("STATE").Value();
nachdem ich jetzt eine Weile debugging betrieben habe, bin ich leider mit meinem Latein am Ende. Ich dache, dass eventuell die Leerrzeichen bzw. die Anführungszeichen das Problem sind, aber auch wenn ich das ändere, laufe ich immer auf einen Fehler

Code: Alles auswählen

 	string fenster_name = "Fenster"#rollo_name.LTrim("Rolladen")#":1";
    if ( DEBUG) { WriteLine ("fenster_name: " # fenster_name );  }
funktioniert und bringt als Ausgabe:
fenster_name: Fenster_Arbeitszimmer_vorn:1

während

Code: Alles auswählen

	integer fenster_status = channels.Get("fenster_name").DPByHssDP("STATE").Value();
als auch

Code: Alles auswählen

	var fenster_status = channels.Get(fenster_name).DPByHssDP("STATE").Value();
immer einen Fehler erzeugt.

Schreibe ich testweise den Kanal direkt in den code:

Code: Alles auswählen

    integer fenster_status = channels.Get ("Fenster_Ankleidezimmer:1").DPByHssDP ("STATE").Value();
funktioniert es tadellos. Insofern scheint es an dem zusammengesetzten string zu liegen.

MichaelN
Beiträge: 9771
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 707 Mal
Danksagung erhalten: 1647 Mal

Re: Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von MichaelN » 04.09.2023, 23:04

Anvaar hat geschrieben:
04.09.2023, 22:31
Ich dache, dass eventuell die Leerrzeichen bzw. die Anführungszeichen das Problem sind,
Ein Text in " ist ein Text. Willst du den Inhalt des Objekt, dann ohne"

Deswegen geht dies nicht :
Anvaar hat geschrieben:
04.09.2023, 22:31
integer fenster_status = channels.Get("fenster_name").DPByHssDP("STATE").Value();
Und das hier ist nicht identisch, wie du behauptet
Anvaar hat geschrieben:
04.09.2023, 22:31
fenster_name: Fenster_Arbeitszimmer_vorn:1
Vs.
Anvaar hat geschrieben:
04.09.2023, 22:31
Schreibe ich testweise den Kanal direkt in den code:

Code: Alles auswählen

integer fenster_status = channels.Get ("Fenster_Ankleidezimmer:1").DPByHssDP ("STATE").Value();

funktioniert es tadellos
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 +++

Anvaar
Beiträge: 7
Registriert: 24.09.2020, 16:24
System: CCU
Hat sich bedankt: 4 Mal

Re: Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von Anvaar » 05.09.2023, 00:12

MichaelN hat geschrieben:
04.09.2023, 23:04
Anvaar hat geschrieben:
04.09.2023, 22:31
Ich dache, dass eventuell die Leerrzeichen bzw. die Anführungszeichen das Problem sind,
Ein Text in " ist ein Text. Willst du den Inhalt des Objekt, dann ohne"

Deswegen geht dies nicht :
Anvaar hat geschrieben:
04.09.2023, 22:31
integer fenster_status = channels.Get("fenster_name").DPByHssDP("STATE").Value();
das war auch meine Idee, deswegen:

Code: Alles auswählen

integer fenster_status = channels.Get(fenster_name).DPByHssDP("STATE").Value(); 
MichaelN hat geschrieben:
04.09.2023, 23:04
Und das hier ist nicht identisch, wie du behauptet
Anvaar hat geschrieben:
04.09.2023, 22:31
fenster_name: Fenster_Arbeitszimmer_vorn:1
Vs.
Anvaar hat geschrieben:
04.09.2023, 22:31
Schreibe ich testweise den Kanal direkt in den code:

Code: Alles auswählen

integer fenster_status = channels.Get ("Fenster_Ankleidezimmer:1").DPByHssDP ("STATE").Value();

funktioniert es tadellos
Sorry, da habe ich beim kopieren der logausgabe nicht aufgepasst. Allerdings sind beide Kanäle gültig:
Fenster_Ankleidezimmer:1
Fenster_Arbeitszimmer_vorn:1
Da alle Fenster in einer foreach Schleife abgearbeitet werden, bin ich beim kopieren der logausgabe verrutscht.

Trotzdem hat mich Deine Antwort auf die richtige Spur gebracht. Die Lösung ist ganz banal: In einem der Fenster (Arbeitszimmer_links) ist noch kein Sensor eingebaut. Deswegen funktioniert dieser code nun auch ganz wunderbar:

Code: Alles auswählen

    ! wir bauen uns den passenden Fensterkontakt Namen (für Kanal:1) aus dem jeweiligen Rollo Namen
    if ( DEBUG) { WriteLine ("rollo_name: " # rollo_name);  }
	string fenster_name = "Fenster"#rollo_name.LTrim("Rolladen")#":1";
    if ( DEBUG) { WriteLine ("fenster_name: " # fenster_name) ; }
	! wir holen uns den Status des Fensterkontaktes
	integer fenster_status = channels.Get (fenster_name).DPByHssDP ("STATE").Value();
    if ( DEBUG) { WriteLine ("fenster_name: " # fenster_name #  " fenster_status: " # fenster_status) ; }

dtp
Beiträge: 10679
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 329 Mal
Danksagung erhalten: 504 Mal

Re: Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von dtp » 05.09.2023, 07:33

Ich hatte da vor einiger Zeit auch mal ein "kleines Skript" geschrieben. Könnte aber etwas über das Ziel hinaus geschossen sein. ;)

Ich selbst nutze es seit dem Umzug in eine andere Wohnung mangels elektrischer Rollläden nicht mehr, aber es läuft weiterhin zuverlässig bei meiner Ex im Haus. 8)
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.

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

Re: Verknüpfung Fensterkontakt und Rolladenaktor über script

Beitrag von Baxxy » 05.09.2023, 08:32

Anvaar hat geschrieben:
05.09.2023, 00:12
Die Lösung ist ganz banal: In einem der Fenster (Arbeitszimmer_links) ist noch kein Sensor eingebaut.
Na das konnte ja keiner ahnen. :wink:
Daher war in meinem Vorschlag auch keinerlei Fehlerhandling drin.
Aber schön das es nun läuft.

Antworten

Zurück zu „HomeMatic IP mit CCU“