Strings in Liste im Script umwandeln
Moderator: Co-Administratoren
-
- 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
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.
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
-
- 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
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.
Ergebnis:
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
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);
}
}
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
Harry
- 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
Deine Lösung enthält gleich mehrere Potentielle "Bäng" Stellen.Pseudoreal hat geschrieben: ↑28.05.2021, 10:15In 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.
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());
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
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
-
- 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
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:
Ergebnis dieses mal (siehe letzte Zeile im Ergebnisfenster): Da es mit foreach... ja auch bei einer unique Raumzuordnung klappt
könnten die Statements auch so abgeändert werden:
Gruß
Harry
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): 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
Harry
-
- 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
Meine Frage war erstmal grundsätzlich an den Fragenden gestellt, der ja das Lastenheft hier nun mal so definiert hat.Tyfys hat geschrieben: ↑27.05.2021, 22:09Alchys 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.
Und erst Recht sollte sie keinen Vorwurf an deine "Günste" darstellen.
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.
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.
Es ist sehr ehrenwert, wenn man selber versucht Lösungen für das eigene Problem zu findenPseudoreal hat geschrieben: ↑28.05.2021, 10:15In 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.
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 ?
Diese Frage darfst du dir gar nicht stellen.
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.
-
- 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
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.
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
- 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
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
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
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
-
- 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
Jetzt hör aber auf.
Er will doch nur die Raumnamen in denen sich "umgangssprachlich offene Fenster" befinden.
Das habe ich auch nicht geschrieben denn meine Aussage enthält noch ein bissel mehrPseudoreal hat geschrieben: ↑29.05.2021, 09:34Die 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.
So missverständlich sollte das nicht sein.
Ich würde an deiner Stelle für die Aufgabe per Script die Räume durchlaufen und entsprechend deiner Vorgabe nach "offenen Fenstern" durchsuchen.Pseudoreal hat geschrieben: ↑29.05.2021, 09:34Deine Annahme, daß ich den Raumnamen bei einem bestimmten Status eines Kanals haben will, ist korrekt - s.a. Frage 2.
[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());}
}
(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]
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.
-
- 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
habe ich es nicht schon geschrieben : ein Problem - drei Programmierer = 5 Lösungen
Gruß
Harry
Gruß
Harry
Harry
-
- 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
@alchy,
ich habe dein Script ausprobiert und es funktioniert - danke dafür.
Gruß
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