Strings in Liste im Script umwandeln

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Pseudoreal
Beiträge: 246
Registriert: 01.05.2020, 19:48
System: CCU
Hat sich bedankt: 78 Mal
Danksagung erhalten: 10 Mal

Re: Strings in Liste im Script umwandeln

Beitrag von Pseudoreal » 28.05.2021, 10:15

In der ersten Überlegung hatte ich auch, dass ich genau wissen will, was offen ist. Im Nachgang kam dann die Überlegung "eigentlich ist es egal, ob Fenster oder Tür des Raumes offen ist, da ich ohnehin in den Raum muss.

Der SDV gibt mir in der Zeile jedoch eine Fehlermeldung, wenn ich das Script laufen lasse:
string Raum = dom.GetObject(channel.ChnRoom()).Name();

ändere ich den Teil ab in string Raum = "abc"; - läuft das script ohne Probleme durch.
1x HmIPW-DRAP, 3x HmIPW-DRI32, 3x HmIPW-DRBL4, 7x HmIPW-DRS8, 1x HmIPW-DRD3, 1x HmIPW-SMI55, 3x HmIPW-WTH, 1x HmIP-HAP, 3x HmIP-STH, 1x HmIP-WTH-2, 3x HmIP-PS, 1x HmIP-SMI, 7x HmIP-SWDO-I, 4x HmIP-SWSD, 3 HmIP-SRH, 2x HmIP-BSL, 3x HmIP-SMI55, 1x HmIP-ASIR, 1xHmIP-ASIR-O

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Strings in Liste im Script umwandeln

Beitrag von Tyfys » 28.05.2021, 12:04

Hallo

Ich hatte das Script nur im Scipteditor der CCU auf Fehler prüfen lassen.Da wurde leider nichts ausgeworfen.

Nun habe ich das einmal anhand meines Gewerkes "Fenster_Verschluss" durchgespielt.

Code: Alles auswählen

WriteLine("Hallo Welt!");
var sec = dom.GetObject("Fenster_Verschluss");
string i;
string list = "";
if (sec)
{
    foreach(i, sec.EnumUsedIDs())
    {
        var channel = dom.GetObject(i);
        WriteLine("ID des Kanals: " # i);
        WriteLine("Name des Kanals: " # channel);
        var channel = dom.GetObject(i);
        var room = dom.GetObject(channel.ChnRoom());
        WriteLine("Raum des Kanals: " # room);
    }
}
Ergebnis:
Stringlist.PNG
Erkenntnis:
Diese Zeile string Raum = dom.GetObject(channel.ChnRoom()).Name();
ändern auf string Raum = dom.GetObject(channel.ChnRoom());

Also ".Name()" am Ende entfernen.

Man lernt nie aus....

Gruß
Harry
Gruß
Harry

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

Re: Strings in Liste im Script umwandeln

Beitrag von Black » 28.05.2021, 12:25

Pseudoreal hat geschrieben:
28.05.2021, 10:15
In der ersten Überlegung hatte ich auch, dass ich genau wissen will, was offen ist. Im Nachgang kam dann die Überlegung "eigentlich ist es egal, ob Fenster oder Tür des Raumes offen ist, da ich ohnehin in den Raum muss.

Der SDV gibt mir in der Zeile jedoch eine Fehlermeldung, wenn ich das Script laufen lasse:
string Raum = dom.GetObject(channel.ChnRoom()).Name();

ändere ich den Teil ab in string Raum = "abc"; - läuft das script ohne Probleme durch.
Deine Lösung enthält gleich mehrere Potentielle "Bäng" Stellen.
1. ChnRoom() enthält einen string der referenzierten Räume , bei mehreren Räumen duch "\t" getrennt.
Bei leeren string liefertein dom.GetObject (xxx.ChnRooms()) ein null, bei Mehreren Räumen ebenso.
auf ein NullObject eine Methode wie Name() angewand= BÄNG.

2. Aufgrund eine Ungenauigkeit, ich könnte auch sagen Bugs des rega-parsers verschluckt sich dom.GetObject, wenn dort direkt danach eine weitere Methode angewand wird. Grund ist der 2. Optionale Parameter bei GetObject.
Syntaktisch ist dein Ansatz korrekt, theoretisch, praktisch aber nicht:
es geht wenn dus klammerst:

Code: Alles auswählen

WriteLine ((dom.GetObject(o.ChnRoom())).Name());  
Der SDV meckert da sofort, da das Ausführen deines Ursprungsscriptes einen Eintrag im Systemprotokoll , nämlich den Scriptruntimeerror zur folge hat und dieses auch brav anzeigt.

In der CCU unter script testen meinst du das es funktioniert, du bekommst ein ergebnis.. aber schau mal ins Systemprotokoll, nachdem du auf ausführen gedrückt hast.. Ups, Scriptruntimerror.
Und wenn du es als richties Programm anlegst... startest und dann ins Systemprotokoll schaust... was finden wir da.. richtig: einen Scriptruntimeerror.


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: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Strings in Liste im Script umwandeln

Beitrag von Tyfys » 28.05.2021, 14:29

Aufgrund der Hinweise von Black hab ich mich nun noch einmal damit beschäftigt. @Black - vielen Dank für die Aufklärung.

Man findet in den DoKus bei "HM_Script_Teil_2_Objektmodell" dazu das Richtige.
Ich hatte zwar gesehen, daß man einen Kanal auch mehreren Räumen zuordnen kann,
hatte für mich aber keinen Sinn. Wer hat schon ein Gerät gleichzeitig in verschiedenen Räumen.


Ich habe nun bei mir das einmal durchgespielt und einen Fensterkontakt einem 2. Raum (ZBV) zugeordnet.
Das Script dazu:

Code: Alles auswählen

WriteLine("Hallo Welt!");
var sec = dom.GetObject("Fenster_Verschluss");
string i;
string list = "";
if (sec)
{
    foreach(i, sec.EnumUsedIDs())
    {
        var channel = dom.GetObject(i);
        WriteLine("ID des Kanals: " # i);
        WriteLine("Name des Kanals: " # channel);
        var channel = dom.GetObject(i);
        var RaumNamen = "";
        string rid;
        foreach(rid, channel.ChnRoom())
        {
            var Raum = dom.GetObject(rid);
            RaumNamen = RaumNamen # Raum.Name() # " ";
        }
        WriteLine("Raum des Kanals: " # RaumNamen);

    }
}

Ergebnis dieses mal (siehe letzte Zeile im Ergebnisfenster):
Stringlist.PNG
Stringlist.PNG (23.96 KiB) 613 mal betrachtet
Da es mit foreach... ja auch bei einer unique Raumzuordnung klappt
könnten die Statements auch so abgeändert werden:

Code: Alles auswählen

                if (isOn == true)
                {
                    string rid;
                    foreach(rid, channel.ChnRoom())
                    {
                        var Raum = dom.GetObject(rid);
                        string RaumName = Raum.Name();
                        !dann prüfen ob der ort schon im string - wenn nicht hinzufügen
                        if (list.Contains(RaumName) == false)
                        {
                            list = list # RaumName # "\n ";
                        }
                    }
                }

Gruß
Harry
Gruß
Harry

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

Re: Strings in Liste im Script umwandeln

Beitrag von alchy » 29.05.2021, 00:11

Tyfys hat geschrieben:
27.05.2021, 22:09
Alchys Einwand hat natürlich seine Berechtigung.
Aber nicht jeder kennt sich so gut wie er in Homematic und den Scriptmöglichkeiten (Datenpunkte / Methoden etc) aus.
Fehler können sich immer einschleichen. Dazu sollte man dann auch genügend Tests durchführen.....

"Jetzt hätte ich zwei Fragen an die Script Profis:"
Vielleicht hätte ich gar nicht antworten sollen, dazu zähle ich mich nun nicht.
Meine Frage war erstmal grundsätzlich an den Fragenden gestellt, der ja das Lastenheft hier nun mal so definiert hat. :wink:
Und erst Recht sollte sie keinen Vorwurf an deine "Günste" darstellen. :roll:
Ich (be)werte hier erstmal gar nichts.
Abgesehen von "nur Copy Paste User Großmäuler" & "Geldverdienen wollen mit fremden Lösungen" interessiert es mich überhaupt nicht, ob du dich mit Scriptmöglichkeiten usw. nun auskennst oder nur am Spielen bist. Abgesehen davon sieht man ja durchaus, ob der Poster eigene Gedanken verwendet oder nur das wiederholt, was er irgendwo im Dutzend von anderen Sachen kopiert hat.
Aber auch von dieser Truppe gibt es hier im Forum genug User.

Grundsätzlich basieren viele Lösungen natürlich auf Fragen von Usern.
Fragen von Usern haben andere User dazu angetrieben für genau diese Fragen (blöd oder komisch oder völlig in Ordnung) irgendwelche Lösungen zu finden, undokumentierte Methoden und Möglichkeiten herauszufinden usw.
Und natürlich nicht zuletzt dann auch hier Lösungen vorzustellen / zu veröffentlichen.
(Zumindest einen Teil davon, denn ich habe bestimmt nicht mal 50% meiner Lösungen offiziell hier veröffentlicht, da lief sehr viel ausschließlich über PN) Aber grundsätzlich schließe ich mich da trotzdem durchaus mit ein.

Tyfys hat geschrieben:
27.05.2021, 22:09
Evtl. hat Alchy ja noch eine bessere Idee.
Lass mich raus, mein Zeit ist vorbei oder zumindest stark eingeschränkt. Meine Blacklist ist voll und damit bin ich hier bis auf Weiteres raus.
Grundsätzlich handelt es sich bei der Frage nach meiner Lesweise eigentlich um ein "Fenster offen " oder auch "Licht an" Script. Und davon gibt es genug veröffentlichte im Forum. Unter anderem auch von mir.
Pseudoreal hat geschrieben:
28.05.2021, 10:15
In der ersten Überlegung hatte ich auch, dass ich genau wissen will, was offen ist. Im Nachgang kam dann die Überlegung "eigentlich ist es egal, ob Fenster oder Tür des Raumes offen ist, da ich ohnehin in den Raum muss.
Es ist sehr ehrenwert, wenn man selber versucht Lösungen für das eigene Problem zu finden :!:
Aber es ist eben genau so wichtig, seine eigentlichen Ziele gut zu beschreiben & entsprechend zu äußern damit andere begreifen, was man eigentlich will.

Wenn ich das richtig interpretiere willst du die Raumnamen bestimmter Kanäle haben, wenn diese bzw. deren Datenpunkte den Status X haben. Korrekt? oder vielleicht doch irgendetwas anderes :?:
Dafür seine Kanäle so zu benennen das man aus diesen Namen irgendwie den Raumnamen mit einem Script extrahieren kann, finde ich irgendwie "daneben". Klar funktioniert das auch unter entsprechenden Bedingungen. Aber wieso ?
Tyfys hat geschrieben:
28.05.2021, 14:29
Ich hatte zwar gesehen, daß man einen Kanal auch mehreren Räumen zuordnen kann,
hatte für mich aber keinen Sinn. Wer hat schon ein Gerät gleichzeitig in verschiedenen Räumen.
Diese Frage darfst du dir gar nicht stellen. :mrgreen:
Es ist nötig, das deine Lösung auch für User tauglich ist, deren Gerätekanäle sich in mehreren Räumen befinden.

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.

Pseudoreal
Beiträge: 246
Registriert: 01.05.2020, 19:48
System: CCU
Hat sich bedankt: 78 Mal
Danksagung erhalten: 10 Mal

Re: Strings in Liste im Script umwandeln

Beitrag von Pseudoreal » 29.05.2021, 09:34

Die Kanäle habe ich nicht so benannt, dass ich die Räume mit dem Script extrahieren kann, sondern um einen Standard zu haben und so auch Duplikate zu vermeiden.

Deine Annahme, daß ich den Raumnamen bei einem bestimmten Status eines Kanals haben will, ist korrekt - s.a. Frage 2.

Wie schon geschrieben, irgendwann bin ich so in der Lösung drin, dass ich gar nicht mehr überlegt habe, welche Attribute zur Auswertung ich noch verwenden kann.

Danke für alle für die Beiträge.
1x HmIPW-DRAP, 3x HmIPW-DRI32, 3x HmIPW-DRBL4, 7x HmIPW-DRS8, 1x HmIPW-DRD3, 1x HmIPW-SMI55, 3x HmIPW-WTH, 1x HmIP-HAP, 3x HmIP-STH, 1x HmIP-WTH-2, 3x HmIP-PS, 1x HmIP-SMI, 7x HmIP-SWDO-I, 4x HmIP-SWSD, 3 HmIP-SRH, 2x HmIP-BSL, 3x HmIP-SMI55, 1x HmIP-ASIR, 1xHmIP-ASIR-O

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

Re: Strings in Liste im Script umwandeln

Beitrag von Black » 29.05.2021, 10:27

Man kann es auch noch so machen.. in den Kanälen, welche durch Alexa angesagt werden sollen,
Einen zusätzlichen Meta Eintrag erzeugen. Z.b. usr_alexa und diesem dann den gewünschten text zuweisen. Z.b. Terassentür. In deiner Schleife benutzt du dann nicht .Name() oder noch stringsubstitutionen sondern .Metadata ("usr_alexa");

Über den Ansatz würde ich gehen, wenn ich es programmieren müsste

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

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

Re: Strings in Liste im Script umwandeln

Beitrag von alchy » 29.05.2021, 23:05

Black hat geschrieben:
29.05.2021, 10:27
Man kann es auch noch so machen.. in den Kanälen, welche durch Alexa angesagt werden sollen,
Einen zusätzlichen Meta Eintrag erzeugen.
Jetzt hör aber auf.
Er will doch nur die Raumnamen in denen sich "umgangssprachlich offene Fenster" befinden.
Pseudoreal hat geschrieben:
29.05.2021, 09:34
Die Kanäle habe ich nicht so benannt, dass ich die Räume mit dem Script extrahieren kann, sondern um einen Standard zu haben und so auch Duplikate zu vermeiden.
Das habe ich auch nicht geschrieben denn meine Aussage enthält noch ein bissel mehr :roll:
So missverständlich sollte das nicht sein.
Pseudoreal hat geschrieben:
29.05.2021, 09:34
Deine Annahme, daß ich den Raumnamen bei einem bestimmten Status eines Kanals haben will, ist korrekt - s.a. Frage 2.
Ich würde an deiner Stelle für die Aufgabe per Script die Räume durchlaufen und entsprechend deiner Vorgabe nach "offenen Fenstern" durchsuchen.

[EDIT]
Auch wenn ich es bereuen werde:
Hier ein erster Versuch ganz auf die Schnelle.

Code: Alles auswählen

! Ausgabe der Raumnamen mit geoeffneten Fenster oder Türen 
! v0.1 Test (c) by Alchy
string sRoomId;string sChanId; 
foreach (sRoomId, dom.GetObject(ID_ROOMS).EnumUsedIDs()) {
object oRoom = dom.GetObject(sRoomId);
integer iCount = 0;
foreach(sChanId, oRoom.EnumUsedIDs()) {
object oChan= dom.GetObject(sChanId);
if ( oChan.IsTypeOf(OT_CHANNEL) ) {
if ( ( oChan.HssType() == "SHUTTER_CONTACT") || (oChan.HssType() =="TILT_SENSOR") || (oChan.HssType().StartsWith("ROTARY_HANDLE")) || ( oChan.HssType() == "KEYMATIC") ) {
if( (oChan.DPByHssDP("STATE").Value())) { iCount = iCount +1;}
} } }
if (iCount > 0){ WriteLine(oRoom.Name());}
}
sollte die Räume ausgeben in denen mindestens ein Sensor mit den berücksichtigten Kanal HssTypen offen ist.
(da ich bei Weitem nicht alle Geräte besitze, brauche ich dann Angaben falls Sensoren nicht berücksichtigt sind.)

Alchy
Zuletzt geändert von alchy am 29.05.2021, 23:33, insgesamt 1-mal geändert.
Grund: [EDIT]

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: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Strings in Liste im Script umwandeln

Beitrag von Tyfys » 30.05.2021, 00:04

Tyfys hat geschrieben:
26.05.2021, 19:49

( ein Problem - drei Programmierer = 5 Lösungen ) :
habe ich es nicht schon geschrieben : ein Problem - drei Programmierer = 5 Lösungen :lol:

Gruß
Harry
Gruß
Harry

Pseudoreal
Beiträge: 246
Registriert: 01.05.2020, 19:48
System: CCU
Hat sich bedankt: 78 Mal
Danksagung erhalten: 10 Mal

Re: Strings in Liste im Script umwandeln

Beitrag von Pseudoreal » 30.05.2021, 10:26

@alchy,

ich habe dein Script ausprobiert und es funktioniert - danke dafür.

Gruß
1x HmIPW-DRAP, 3x HmIPW-DRI32, 3x HmIPW-DRBL4, 7x HmIPW-DRS8, 1x HmIPW-DRD3, 1x HmIPW-SMI55, 3x HmIPW-WTH, 1x HmIP-HAP, 3x HmIP-STH, 1x HmIP-WTH-2, 3x HmIP-PS, 1x HmIP-SMI, 7x HmIP-SWDO-I, 4x HmIP-SWSD, 3 HmIP-SRH, 2x HmIP-BSL, 3x HmIP-SMI55, 1x HmIP-ASIR, 1xHmIP-ASIR-O

Antworten

Zurück zu „HomeMatic allgemein“