undokumentierte Skript-Befehle

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: undokumentierte Skript-Befehle

Beitrag von MichaelN » 07.07.2020, 19:54

dtp hat geschrieben:
07.07.2020, 10:53
Ich komme eigentlich mit den offiziell dokumentierten Skript-Befehlen ganz gut zurecht.
.SunAzimuth() war schon sehr hilfreich und möchte ich nicht missen
Sinnvoll wäre aber meines Erachtens, in der Doku darauf hinzuweisen, dass man statt "dom.GetObject(...)" besser "dom.GetObject(ID_xxxx).Get(...)" verwenden sollte.
Eben, damit fängt es ja schon an. Selten eine so schlechte Doku gesehen.
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: 10655
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: undokumentierte Skript-Befehle

Beitrag von dtp » 07.04.2021, 12:35

Hi,

ich arbeite ja sehr gerne mit Listen. Sind euch ggf. noch weitere web-Befehle außer

Code: Alles auswählen

web.webGetValueFromList(...)
web.webGetValueListCount(...)
bekannt, die man da nutzen könnte? Evtl. gibt es ja auch weitere Parameter, die man innerhalb eines web-Befehls setzen kann. Z.B., um auch Listen abarbeiten zu können, deren Einträge nicht durch ein Simikolon, sondern durch andere Zeichen getrennt sind. Würde einem ggf. die vorherige Konvertierung mittels .Replace("xxx", ";") ersparen und hilft Fehler zu vermeiden, wenn in der Liste Strings enthalten sind, die ein Simikolon aufweisen, das eben kein Trennzeichen sein soll.
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.

alchy
Beiträge: 10752
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 672 Mal

Re: undokumentierte Skript-Befehle

Beitrag von alchy » 09.04.2021, 23:44

Das eine
dtp hat geschrieben:
07.04.2021, 12:35
ich arbeite ja sehr gerne mit Listen
hat mit dem anderen
dtp hat geschrieben:
07.04.2021, 12:35
ind euch ggf. noch weitere web-Befehle außer
CODE: ALLES AUSWÄHLEN

web.webGetValueFromList(...)
web.webGetValueListCount(...)
bekannt, die man da nutzen könnte?

nur insofern zu tun, das webGetValueFromList() & .webGetValueListCount() die einzigsten Methoden sind, welche im Namensraum web halbwegs etwas damit zu tun haben. Zumindest die , welche mir auf die Schnelle bekannt sind.
Andere dort im namensraum web anwendbare Methoden wären z.B. .webStringTable() oder .webKeyFromStringTable() welche sich dann ganz grob mit der Übersetzungstabelle beschäftigen usw.
dtp hat geschrieben:
07.04.2021, 12:35
um auch Listen abarbeiten zu können, deren Einträge nicht durch ein Simikolon, sondern durch andere Zeichen getrennt sind.
Die Bearbeitung von Systemvariablen Typ Enums ist natürlich auch über z.B. .ValueList() möglich welche auch schreibend tätig werden kann.
Den aktuellen Wert einer Wertelistenvariablen kann man ja bekanntermaßen über;

Code: Alles auswählen

object oList = dom.GetObject("NAME WERTELISTE");
WriteLine( web.webGetValueFromList(oList.ValueList(), oList.Value()) );
oder auch über

Code: Alles auswählen

object oList = dom.GetObject("NAME WERTELISTE");
WriteLine( oList.ValueList().StrValueByIndex(";", oList.Value()) );
ausgeben.
Mit anderen Trennzeichen hat das dann wieder nichts mit Systemvariablen Werteliste zu tun, denn die sind immer so.
Also redest du nicht von Wertelistenvariablen sondern von wie auch immer separierte Strings nehme ich an.

Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: undokumentierte Skript-Befehle

Beitrag von Tyfys » 29.08.2022, 14:36

Ich hab noch etwas mit system.GenerateEnum() experimentiert.

Und da festgestellt, das funktioniert auch mit negativen Zahlen.

So kann man dann eine Foreach-Schleife mit absteigendem Index realisieren:

Code: Alles auswählen

string index;
foreach (index,(system.GenerateEnum(-20,-10)).Replace("-","")) {
WriteLine(index.ToInteger());
}
Vielleicht kann es jemand gebrauchen.....
Gruß
Harry

Benutzeravatar
Black
Beiträge: 5463
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 418 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: undokumentierte Skript-Befehle

Beitrag von Black » 21.10.2022, 19:56

Ich erweiter dann auch nochmal ein bisschen:

der xml Variablenbezeichner und dessen Methoden

neben boolean, integer, time etc gibt es u.a. auch den Variablenbezeichner xml. Diesen findet man natürlich auch nicht bei der "offiziellen" Scriptdoku bei EQ3.

Mit Hilfe des Methoden von XML kann man ohne viel String Such Gedönse ein xml FIle bzw ein xml String analysieren. Mein Interesse für diesen Datentyp hielt sich bissher in engeren Grenzen, im Realumfeld bei mir beherrscht dieses IOBroker unter JSScript bzw der Freepascal Compiler, mit dem ich den SDV geschrieben habe, dieses xmal besser und schneller als die CCU. Nicht destro trotz kann dieses aber trotzdem hilfreich sein.

vorgehensweise:
1. man versuche eine xml Antwort zu analysieren. z.b. eine der CCU internen, die der Aufruf aus dem xmlrpc Namenraum als Ergebnis liefert.

.Parse()
Parse dient dazu, einen String in ein xml Object zu bekommen.
syntax: [xml]= [xml].Parse(AText: string);
Beispiel:

Code: Alles auswählen

xml x;
xml xStruct = x.Parse(xmlrpc.GetParamset(oInterface, sDevSerial, "MASTER")); 
oder

Code: Alles auswählen

xml xStruct = x.Parse("<struct><member><name>ADAPTIVE_REGULATION</name><value><i4>2</i4></value></member><member><name>BOOST_AFTER_WINDOW_OPEN</name><value><boolean>0</boolean></value></member></struct>"); 
.GetChildNode()
GetChildnode liefert das 1. bzw das AIndex (Index beginnt mit 0!) Node mit dem Namen "AText" als xml-Object zurück
Syntax
[xml]= [xml].GetChildNode(AText: string);
[xml]= [xml].GetChildNode(AText: string, AIndex: integer);
Beispiel: Es exitiere das xml xNode mit folgendem, geparsten Inhalt:
<struct>
<member><name>ADAPTIVE_REGULATION</name><value><i4>2</i4></value></member>
<member><name>BOOST_AFTER_WINDOW_OPEN</name><value><boolean>0</boolean></value></member>
</struct>

GetCHildNode kann nun folgendermaßen angewandt werden:
xml x1=xNode.GetChildNode ("member",0); ergibt das Node: <member><name>ADAPTIVE_REGULATION</name><value><i4>2</i4></value></member>
xml x1=xNode.GetChildNode ("member",1); ergibt das Node: <member><name>BOOST_AFTER_WINDOW_OPEN</name><value><boolean>0</boolean></value></member>

Bei einem nicht vorhandenem Nodenamen ist das Ergebnis ein leeres Node. EIn nicht leeres Node kann so identifiziert werden:
'if (xNode) {Tue was;}'

Bei einer AUfzählung von ParameterNodes wie bei einem Getparamset muss man also eine Zählvariable benutzen und dann abbrechen, wenn das GetChildNode nach dem Increment dann ein LeerNode ergibt.

.GetName()
Syntax [string]=[xml].GetName();
Liefert den Namesbezeichner des XML Node
Beispiel: Es exitiere das xml xNode mit folgendem, geparsten Inhalt:
<member><name>BOOST_AFTER_WINDOW_OPEN</name><value><boolean>0</boolean></value></member>
WriteLine (xNode.GetName()); liefert als Ergebnis: member

.GetText()
Syntax [string]=[xml].GetText();
Liefert den Wert eines XML Node
Beispiel: Es existiere das xml xNode mit folgendem, geparsten Inhalt:
<name>BOOST_AFTER_WINDOW_OPEN</name>
WriteLine (xNode.GetText()); liefert als Ergebnis: BOOST_AFTER_WINDOW_OPEN

.GetAttribute()
Syntax [string]=[xml].GetAttribute(AAttri: string);
Liefert das durch AAttri spezifizierte Attribut des XML Node
Beispiel: Es exitiere das xml xNode mit folgendem, geparsten Inhalt:
<name MSET="BOOST_AFTER_WINDOW_OPEN"><value><i4>2</i4></value></name>
WriteLine (xNode.GetAttribute("MSET")); liefert als Ergebnis: BOOST_AFTER_WINDOW_OPEN

Hinzu kommen noch die üblichen Methoden
.Vartype() liefert auf eine xml Variable den Wert 20

.ToString (); gibt des Text des XNodes aus

.Type() gibt xml aus

EIn praktisches Beispiel dazu wurde von @Henke hier im Forum publiziert.

Black

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

Re: undokumentierte Skript-Befehle

Beitrag von MichaelN » 23.10.2022, 11:56

Ich brauchte etwas um das nachzuvollziehen, weil deine Beispiele nicht auf einander aufbauen.

Hier ein primitives Beispiel um einen Wert aus einem XML auszulesen:

Code: Alles auswählen

xml x;
xml xStruct = x.Parse("<struct><member><name>ADAPTIVE_REGULATION</name><value><i4>2</i4></value></member><member><name>BOOST_AFTER_WINDOW_OPEN</name><value><boolean>0</boolean></value></member></struct>");

xml xNode=xStruct.GetChildNode ("member",0);

if (xNode)
   {
    WriteLine("gültiger Node");
    WriteLine (xNode.GetName());
    xml xValue = xNode.GetChildNode("value");
    xml xVal = xValue.GetChildNode("i4");
    var result = xVal.GetText().ToFloat();
    WriteLine (xVal.GetName());
    WriteLine(result);
    }
Um an den Boolean Wert aus

Code: Alles auswählen

<name>BOOST_AFTER_WINDOW_OPEN</name><value><boolean>0</boolean>
ranzukommen ändert man die Abfrage für xVal auf

Code: Alles auswählen

xml xVal = xValue.GetChildNode("boolean");
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: undokumentierte Skript-Befehle

Beitrag von Henke » 23.10.2022, 15:07

Code: Alles auswählen

xml sIn = "<irgendwas><struct><member><name>ADAPTIVE_REGULATION</name><value><i4>2</i4></value></member><member><name>BOOST_AFTER_WINDOW_OPEN</name><value><boolean>0</boolean></value></member></struct></irgendwas>";

xml xStruct = xStruct.Parse(sIn).GetChildNode("struct");
! Normalerweise ist <struct> nicht die erste Node, daher habe ich das Beispiel etwas geändert
! Wichtig ist dabei, das direkt beim ersten Parsen zu machen, da sonst das komplette xml 2 mal kopiert wird.
! Das ergibt üble Laufzeiten bei großen Mastersets

! Auch die direkte Auflistung läuft
    var result = xStruct.GetChildNode ("member",0).GetChildNode("value").GetChildNode("i4").GetText() ;
    if ( result )
    {    WriteLine(result.ToFloat()); }
    else
    {    WriteLine("ungültig"); }



Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: undokumentierte Skript-Befehle

Beitrag von Tyfys » 25.03.2023, 10:17

zu foreach

ist da schon jemand drauf gestossen?
Oder steht das irgendwo ?

Code: Alles auswählen

integer  max=  5;
WriteLine(max.Type());

string index;

foreach ( index , max) {
WriteLine(index);
}

WriteLine("\nsogar so:");
foreach ( index , 3) {
WriteLine(index);
}
ist mir zufällig aufgefallen
Gruß
Harry

Benutzeravatar
Black
Beiträge: 5463
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 418 Mal
Danksagung erhalten: 1069 Mal
Kontaktdaten:

Re: undokumentierte Skript-Befehle

Beitrag von Black » 25.03.2023, 10:44

bekannt ja, ist aber halt durch den Wertebereich (positive Zahlen) und fix beginnend bei 1 eingeschränkt.

ausserdem ist immer die Gefahr, dass Funktionen, die abweichend der Beschreibung "irgendwie" gehen, dann auf einmal bereinigt werden und dann nicht mehr so wie früher funktionieren. (Beispie sei die Escaping Braking Changes des Jahres 2020).

Black
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: undokumentierte Skript-Befehle

Beitrag von Tyfys » 25.03.2023, 11:01

Black hat geschrieben:
25.03.2023, 10:44
ausserdem ist immer die Gefahr, dass Funktionen, die abweichend der Beschreibung "irgendwie" gehen, dann auf einmal bereinigt werden und dann nicht mehr so wie früher funktionieren
wohl wahr
Gruß
Harry

Antworten

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