Kalender-Script V2.x - MEGA-Version für D-A-CH

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

Moderator: Co-Administratoren

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

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von MichaelN » 29.12.2022, 10:00

Mir wäre es lieber gewesen wir hätten das im Kalender Skript Thread besprochen, da es kein Problem des JSON Skript ist. Ich werde mal die Moderation fragen, ob die das verschieben können.

Direkte Integration in mein Skript ist schwierig, da die Werte nicht zwischen gespeichert werden.

Du müsstest am Ende die automatisch befüllten SV auslesen und dann konvertiert in eine SV für das Kalender Skript schreiben. Oder das Skript so umbauen das dort die Datum Werte gleich konvertiert werden. Aber da müsste ich selber erstmal schauen wo das am passen rein passt.
Zuletzt geändert von alchy am 29.12.2022, 19:00, insgesamt 1-mal geändert.
Grund: abgetrennt, verschoben, Titel geändert
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 +++

TSNr1
Beiträge: 89
Registriert: 22.12.2015, 19:53
Hat sich bedankt: 5 Mal

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von TSNr1 » 29.12.2022, 12:58

MichaelN hat geschrieben:
29.12.2022, 10:00
Mir wäre es lieber gewesen wir hätten das im Kalender Skript Thread besprochen, da es kein Problem des JSON Skript ist. Ich werde mal die Moderation fragen, ob die das verschieben können.
Sorry das ich den Beitrag gentert habe. Dachte das könnte eventuell auch andere Nutzer deines Skripts interessieren ob solch eine umformatierung von Daten direkt integriert werden kann.
Direkte Integration in mein Skript ist schwierig, da die Werte nicht zwischen gespeichert werden.
Verstehe.
Du müsstest am Ende die automatisch befüllten SV auslesen und dann konvertiert in eine SV für das Kalender Skript schreiben. Oder das Skript so umbauen das dort die Datum Werte gleich konvertiert werden. Aber da müsste ich selber erstmal schauen wo das am passen rein passt.
Hättest du dafür kurz nen Codeschnipsel für mich, hab meine Automation die letzten 5 Jahre bissl schleifen lassen und bin mit meinem Skriptverständnis bisschen eingerostet.
Zuletzt geändert von alchy am 29.12.2022, 19:01, insgesamt 1-mal geändert.
Grund: abgetrennt, verschoben, Titel geändert

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

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von MichaelN » 29.12.2022, 13:20

Code: Alles auswählen

! System-Variable auslesen
var Daten = dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname").Value();
! System-Variable beschreiben
dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname").State(Daten);

! falls man nicht sicher sein kann, das die Systemvariable auch existiert:
object SV;
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname");
if (SV) { SV.State(Daten); }
Zuletzt geändert von alchy am 29.12.2022, 19:02, insgesamt 1-mal geändert.
Grund: abgetrennt, verschoben, Titel geändert
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 +++

TSNr1
Beiträge: 89
Registriert: 22.12.2015, 19:53
Hat sich bedankt: 5 Mal

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von TSNr1 » 29.12.2022, 13:34

MichaelN hat geschrieben:
29.12.2022, 13:20

Code: Alles auswählen

! System-Variable auslesen
var Daten = dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname").Value();
! System-Variable beschreiben
dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname").State(Daten);

! falls man nicht sicher sein kann, das die Systemvariable auch existiert:
object SV;
SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname");
if (SV) { SV.State(Daten); }
Merci lieber Michael. Und dazwischen muss dann der Schnipsel den Henke gepostet hat zum umformatieren des Datums oder?
Zuletzt geändert von alchy am 29.12.2022, 19:09, insgesamt 1-mal geändert.
Grund: abgetrennt, verschoben, Titel geändert

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

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von MichaelN » 29.12.2022, 13:37

Ein bisschen mehr Logik braucht es noch um deinen Wunsch vollumfänglich zu erfüllen. Das ist mir derzeit am Handy aber zu umständlich. Henke ist vermutlich schneller :wink:
Zuletzt geändert von alchy am 29.12.2022, 19:02, insgesamt 1-mal geändert.
Grund: abgetrennt, verschoben, Titel geändert
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
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von Henke » 29.12.2022, 13:54

Code: Alles auswählen

object SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get("sysvarname");
! falls man nicht sicher sein kann, das die Systemvariable auch existiert:
if (!SV) {	quit; }

! System-Variable auslesen
string Daten = SV.Value();

! System-Variable beschreiben
Daten = Daten.Substr(8,2) # "." # Daten.Substr(5,2) # "." # Daten.Substr(0,4);
SV.State(Daten);
Zuletzt geändert von alchy am 29.12.2022, 19:03, insgesamt 1-mal geändert.
Grund: abgetrennt, verschoben, Titel geändert

Benutzeravatar
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von Henke » 29.12.2022, 15:04

Variablen in Liste zwischengespeichert, Datum umformatiert und in sOut gesammelt.

Code: Alles auswählen

!JSON universell auslesen
!V1.11 MichaelN https://homematic-forum.de/forum/viewtopic.php?f=18&t=68762
!GPL-3.0-or-later
string url = "https://ferien-api.de/api/v1/holidays/NI/2023.json";
url = "wget --no-check-certificate --timeout=2 -O - '"#url#"'";
string prefix = "JSON_";
string CUXD_Device = ""; ! falls man CUxD  nutzt, Device eintragen z.B. "CUxD.CUX2801001:1"
! optional kann man Texte am Anfang und Ende abschneiden
string Start_JSON ='['; ! 'Hier den Start des eigentlichen JSON-Codes eingeben'
string Ende_JSON =']'; ! 'Hier den Ende des eigentlichen JSON-Codes eingeben'
! Trenner kann notfalls angepasst werden, wenn es mit den Nutzdaten kollidiert
string TrennerArray = " \ ";  TrennerArray = TrennerArray.Trim();
string TrennerArrayErsatz = "/";
! festlegen welche Zeichen in den Nutzdaten durch welches Zeichen ersetzt werden
string ersetzen = ":,[]{}";
string durch = " ";

string rueck;
string error;
object SV;
string SVName;
var Wert;

!- Abruf der Daten
if ( !CUXD_Device ) {
! system.exec
system.Exec(url , &rueck, &error);
} else {
! CUxD
dom.GetObject(CUXD_Device#".CMD_SETS").State(url);
dom.GetObject(CUXD_Device#".CMD_QUERY_RET").State(1);
rueck = dom.GetObject(CUXD_Device#".CMD_RETS").State();
}


string sList = "";

if (!rueck== "")
{
   WriteLine("=== HTTP-Request OK === "#rueck);
   if ( Start_JSON.Length() > 0 ) {
       ! JSON am Anfang kürzen
	   rueck = rueck.Substr(rueck.Find(Start_JSON));
   }
   if ( Ende_JSON.Length() > 0 ) {
       ! JSON am Ende kürzen
	   rueck = rueck.Substr(0,rueck.Find(Ende_JSON));
   }
   rueck = rueck.ToLatin(); ! wegen deutschen Umlauten
   rueck = rueck.Trim(" {}[]");
   rueck = rueck.Replace('\n','');
   rueck = rueck.Replace('\r','');
   rueck = rueck.Replace('_','-');
   rueck = rueck.Replace('-','.');
   rueck = rueck.Replace(TrennerArray,TrennerArrayErsatz);
   if (rueck.Substr(0,1) == "[" ) { rueck = "data:"#rueck; }
   WriteLine("=== nach Replace === '"#rueck#"'");


! Array und Payload aufbereiten
   integer pos1 = 0; integer posG = 0;
   integer pos2 = rueck.Length();
   string temp = ""; string temp2;
   string teil;
   boolean Array = false; boolean Payload = false;
   while ( pos1 < pos2 )
	 {
         teil = rueck.Substr(pos1,1);
         if ( teil == "[")
            {! Array gefunden
            Array = true;
            }
         if ( (teil == "," ) && Array )
           {! Komma gegen Schraegstrich tauschen
            teil = TrennerArray;
            }
         if ( teil == "]")
            {! Array Ende
            Array = false;
            }
         if (  teil == '"' ) {
            if ( Payload )
            {! Payload Ende
            Payload = false;
            } else {
            ! Payload Start
            Payload = true;
            }
            }
         if ( ( ersetzen.Contains(teil) )  && Payload )
           {! verbotene Zeichen austauschen
            teil = durch;
            }
         temp = temp#teil;
         pos1 = pos1 + 1;
		 }
   rueck = temp;
   rueck = rueck.Replace('"','');
   WriteLine("=== nach Aufbereitung === '"#rueck#"'");
   WriteLine("=== Output V1.11 ===");

   string Part; string SVNameArray;
   string Gruppe = ""; string GruppeNeu;
   integer G1; integer G2;
   integer ArrayZaehler = 0;
   boolean ArrayMitGruppe = false;

   foreach (Part, rueck.Split(",") ){
          if (Part.Contains(":"))
          {
           if (Part.Contains("{"))
           { ! Unter-Objekt gefunden
             !WriteLine("Z96 Part='"#Part#"'"); ! *** DEBUG

             if (Part.Contains("[")) {
               ! enthält Arrray
               GruppeNeu = Part.StrValueByIndex(":", 0);
               GruppeNeu = GruppeNeu.Trim() #"_";
               Part = Part.Substr(GruppeNeu.Length()+2).Trim("{ ");
               Gruppe = Gruppe # GruppeNeu; Gruppe = Gruppe.Replace("__","_");
               !WriteLine("Gruppe alt:"#Gruppe); ! DEBUG ***
               !WriteLine("Inhalt alt:"#Part); ! DEBUG ***
             } else {
               ! enthält kein Array, aber möglicherweise geschachtelte Objekte
               temp = Part.Replace("{",";");
               G2 = web.webGetValueListCount(temp);
               G1=0;
               while (G1 < (G2-1)) {
               GruppeNeu = web.webGetValueFromList(temp,(G1)).Trim(" :");
               if ( (GruppeNeu == "_") || (GruppeNeu == "") ) {
               	    ArrayZaehler = ArrayZaehler + 1;
                    GruppeNeu = ArrayZaehler.ToString(0).Trim() # "_";
                    }
               Gruppe = Gruppe # GruppeNeu # "_";
               G1 = G1 + 1;
               }
               if ( Gruppe == "_" ) {
               	    ArrayZaehler = ArrayZaehler + 1;
                    Gruppe = ArrayZaehler.ToString(0).Trim() # "_";
                    }
               Gruppe = Gruppe.Replace("__","_");
               Part = web.webGetValueFromList(temp,(G2-1));
               !WriteLine("Gruppe neu:"#Gruppe); ! *** DEBUG
               !WriteLine("Inhalt neu:"#Part); ! **** DEBUG
             }

             !WriteLine("=== GRUPPE-START: "#Gruppe);
           }
           if (Part.Contains(TrennerArray)) {
              ! Array gefunden
              !WriteLine("=== ARRAY auflösen:"#Part);
              ArrayMitGruppe = false;
              Part = Part.Replace("[","");
              Part = Part.Replace("]","");
              pos1 = 0;  posG = 0;
              SVName = Gruppe;
              if (Part.Contains(":"))
                  {
                  SVName = Part.StrValueByIndex(":", 0);
                  Part = Part.Substr(SVName.Length()+1).Trim();
                  SVName = SVName.Trim("[{ ");
		  !WriteLine("*** Z365 ARRAY aufgelöst in:"#SVName#"==="#Part#"===");  ! DEBUG ***
                  }
              foreach (temp,Part.Split(TrennerArray))
              	{
                !WriteLine("Z352 temp="#temp); ! DEBUG ***

                if ( temp.Contains(":")) {
                ! Array enthält eine Gruppe

                  SVName = temp.StrValueByIndex(":", 0).Trim("{ ");
                  temp2 = temp;
                  temp = temp.StrValueByIndex(":", 1).Trim(" []");
                  SVNameArray = SVName#posG.ToString(0).Trim();
                      if ( temp.Contains("{")) {
                      ! weitere Gruppe gefunden
                      ArrayMitGruppe = true;
                      Gruppe = Gruppe # SVName # "_";
                      temp = temp.Trim(" {"); ! temp.StrValueByIndex("{", 1).Trim();
                      SVName = temp;
                      temp = temp2.StrValueByIndex(":", 2).Trim(" []");
                      SVNameArray = SVName#posG.ToString(0).Trim();
                      !WriteLine("Z363 Gruppe="#Gruppe#" SVNameAray="#SVNameArray#" temp="#temp); ! DEBUG ***
                      }

                  if ( temp.Contains("}")) { posG = posG + 1; }
                  !WriteLine("Z367 Gruppe="#Gruppe#" SVNameAray="#SVNameArray#" temp="#temp); ! DEBUG ***
                  WriteLine ( prefix # Gruppe # SVNameArray #" = '"# temp.Trim(" {[]}") #"'");
	              SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get((prefix # Gruppe # SVNameArray));
     	          if (SV) {
                   SV.State(temp.Trim(" {[]}"));
                   WriteLine("=== SV "#prefix # Gruppe # SVNameArray #" written ===");
                   }
                } else {
                ! keine Gruppe
                  SVNameArray = SVName#pos1.ToString(0).Trim();
                  WriteLine (prefix # Gruppe # SVNameArray #" = '"# temp.Trim(" {[]}") #"'");
	              SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get((prefix # Gruppe # SVNameArray));
     	          if (SV) {
                   SV.State(temp.Trim(" {[]}"));
                   WriteLine("=== SV "#prefix # Gruppe # SVNameArray #" written ===");
                   }
                  pos1 = pos1 + 1;
                  }
           		if ( (temp.Contains("}")) && (ArrayMitGruppe)  )
           		{ ! Unter-Objekt zu Ende
               		  ! Gruppe um letzten Eintrag kürzen
               		  temp2 = Gruppe.Replace("_",";");
               		  G2 = web.webGetValueListCount(temp2);
                      !WriteLine("Z365 GRUPPE: "#Gruppe#" ==="); ! DEBUG ***
               		  Gruppe = ""; G1=0;
               				while (G1 < (G2-2)) {
               				Gruppe = Gruppe # web.webGetValueFromList(temp2,(G1)) # "_";
                			!WriteLine("Z368 "#G1#"/"#G2#":"#Gruppe); ! *** DEBUG
               				G1 = G1 + 1;
               				}
             		!WriteLine("=== Z374 GRUPPE-ENDE: "#Gruppe#" ===");
                    ArrayMitGruppe = false;
           		}


                }
                if ( posG > 0 ) {
                	!WriteLine("Z413 Part="#Part); ! *** DEBUG

              		! Gruppe um letzten Eintrag kürzen
               		temp2 = Gruppe.Replace("_",";");
               		G2 = web.webGetValueListCount(temp2);
                    !WriteLine("=== GRUPPE-ENDE (array): "#Gruppe#"***");
               		Gruppe = ""; G1=0;
               		while (G1 < (G2-2)) {
               				Gruppe = Gruppe # web.webGetValueFromList(temp2,(G1)) # "_";
                			!WriteLine("Z422 "#G1#"/"#G2#":"#Gruppe); ! *** DEBUG
               				G1 = G1 + 1;
               				}

                        }
			! ARRAY ENDE


           } else {
           ! ohne Array
           ! WriteLine("Z154 Part='"#Part#"'"); ! *** DEBUG
           Part = Part.Replace(":",";");
           SVName = Gruppe#web.webGetValueFromList(Part,0).Trim();
           Wert = web.webGetValueFromList(Part,1).RTrim("}").Trim(" {[]}");
           WriteLine ( prefix # SVName #" = '"# Wert #"'");
           if ( sList ) { sList = sList # "\t"; }
           sList = sList # SVName # "|" # Wert;

	       SV = dom.GetObject(ID_SYSTEM_VARIABLES).Get((prefix # SVName));
     	   if (SV) {
                   SV.State(Wert);
                   WriteLine("=== SV "#prefix # SVName #" written ===");
                   }
           if (Part.Contains("}"))
             { ! Unter-Objekt zu Ende
             ! *** Gruppe muss um so viele Einträge gekürzt werden, wie } vorhanden sind in Part ***
             Part = Part.Replace(" ","");
             ! WriteLine("Z199 Part='"#Part#"'"); ! *** DEBUG
             while ( Part.EndsWith("}") ) {
               ! Gruppe um letzten Eintrag kürzen
               temp = Gruppe.Replace("_",";");
               G2 = web.webGetValueListCount(temp);
               Gruppe = ""; G1=0;
               while (G1 < (G2-2)) {
               		Gruppe = Gruppe # web.webGetValueFromList(temp,(G1)) # "_";
               		! WriteLine("=== "#G1#":"#Gruppe); *** DEBUG
               		G1 = G1 + 1;
               		}
               Part = Part.Substr(0,(Part.Length()-1)) ;
               ! WriteLine("Z212 Part="#Part); ! *** DEBUG
             } ! Ende while
             !WriteLine("=== GRUPPE-ENDE: "#Gruppe#" ===");
            }
           }
         }
   }

   string sOut = "";
   if ( sList )
   {
   string sItem;
   foreach(sItem, sList){
   string sID = sItem.StrValueByIndex("|",0);
	string sWert = sItem.StrValueByIndex("|",1);

    ! Sonderbehandlung Datum
       if ( sID.Contains("start") || sID.Contains("end")  )
    {
    sWert = sWert.Substr(8,2) # "." # sWert.Substr(5,2) # "." # sWert.Substr(0,4);
sOut = sOut # sWert;
if ( sID.Contains("start") ) { sOut = sOut # ","; }
else { sOut = sOut # ";"; }
   ! WriteLine ( "->" #  sID # "---" # sWert );
   }
                     }
   }

! und das in eine Variable schreiben
WriteLine ( sOut );

} else {
  WriteLine("Error at HTTP Request");
}
Zuletzt geändert von alchy am 29.12.2022, 19:03, insgesamt 1-mal geändert.
Grund: abgetrennt, verschoben, Titel geändert

PCSHG
Beiträge: 103
Registriert: 07.10.2017, 15:14
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 1 Mal

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von PCSHG » 30.12.2022, 14:31

Hallo,

ich habe ein Problem mit den Variablen:
"SYS-Festtag-Termine" > Pos. 61 / Typ = Zeichenkette oder Werteliste
"IST-Festtag-Heute" > Pos. 62 / Typ = Logik oder Werteliste
"IST-Festtag-Heute-Auswahl" > Pos. 63 / Typ = Werteliste

SYS-Festtag-Termine (als Werteliste): 24.12.;25.12.;26.12.;31.12.;01.01.;OS;OS+1;OS+49;OS+50;
IST-Festtag-Heute (als Logikwert): JA/NEIN
IST-Festtag-Heute-Auswahl: 24.12.;25.12.;26.12.;31.12.;01.01.;OS;OS+1;OS+49;OS+50;

Mein Problem besteht darin, dass die Variable IST-Festtag-Heute auf JA steht, obwohl kein Festtag definiert ist.
808 Kanäle in 128 Geräten:
1x HM-CC-VG-1, 1x HM-OU-LED16, 1x HM-RC-19, 1x HM-WDS100-C6-O, 1x HmIP-ASIR, 2x HmIP-BDT, 3x HmIP-BRC2, 2x HmIP-BROLL, 13x HmIP-BSM, 9x HmIP-eTRV-2, 1x HmIP-FCI6, 4x HmIP-FROLL, 2x HmIP-FSI16, 8x HmIP-FSM, 3x HmIP-FSM16, 3x HmIP-HAP, 3x HmIP-PDT, 6x HMIP-PS, 10x HMIP-PSM, 1x HmIP-RCV-50, 3x HmIP-SAM, 1x HmIP-SCI, 20x HmIP-SRH, 15x HMIP-SWDO, 8x HmIP-SWSD, 1x HmIP-WGC, 1x HMIP-WRC2, 1x HmIP-WTH-2, 1x HmIPW-DRAP, 1x HmIPW-DRS8, 1x RPI-RF-MOD

Benutzeravatar
HM-Villa
Beiträge: 488
Registriert: 24.01.2022, 10:13
System: CCU
Hat sich bedankt: 28 Mal
Danksagung erhalten: 113 Mal

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von HM-Villa » 09.01.2023, 10:31

Hallo PCSHG,

konntest Du Dein Problem inzwischen lösen? Es sollte helfen, die Semikolons am Ende der Wertelisten zu entfernen.
______________________________________________________
950 Kanäle in 201 Geräten und 39 CUxD-Kanäle in 5 CUxD-Geräten

Anderl83
Beiträge: 25
Registriert: 15.06.2023, 15:39
System: CCU

Re: Kalender-Script V2.x - MEGA-Version für D-A-CH

Beitrag von Anderl83 » 24.10.2023, 10:57

sitz gerade auf dem Schlauch. Habe einzelne Variable und Programm nun drin.

Allerdings würde ich gerne darünerhinaus eine Variable für alle Feiertage und Ferientage aus Hessen in einer haben. Hat das zufällig jemand? Wenn ja auf was muss ich achten?

Eingestellt habe ich zusätzlich zu dem eigentlichen Skript unter Programme die Variable SYS-Länderkennung und die entsprechende Programmeintragung für Hessen. Beides wurde auch gestartet.

Danke.

Antworten

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