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

Strings in Liste im Script umwandeln

Beitrag von Pseudoreal » 26.05.2021, 11:45

Hallo zusammen,

ich habe bei mir alle Geräte nach folgenden Schema benannt Ort.Geschoss.Raum.Element(.Gerät). Beispielshaft I.EG.Wohnzimmer.Terassentür.SWDM oder A.OG.Balkon.Licht.

Jetzt habe ich ein vorhandenes Script so umgeschrieben, dass mir die offenen Fenster bzw. Türen aufgezählt werden und dann via Alexa ausgegeben werden. Jetzt sagt natürlich Alexa zu mir: "Folgende Türen oder Fenster sind offen: I.EG.Wohnzimmer.Terassentür.SWDM" und das klingt natürlich nicht sehr schön und ist dann bei mehreren offenen Türen / Fenstern dann auch noch extra lang.
Ich könnte jetzt natürlich alle Geräte umbennen, so dass aus I.EG.Wohnzimmer.Terassentür.SWDM nur Wohnzimmer Terassentür wird. Das würde das Problem größtenteils beseitigen, aber a) möchte ich nicht alle Geräte umbenennen und b) haben manche Elemente mehrere Geräte - beispielshaft I.EG.Wohnzimmer.Terassentür.SRH.

Jetzt hätte ich zwei Fragen an die Script Profis:
1. Wie kann ich während der Laufzeit des Scripts die Umbenennung vornehmen, so dass ich nicht alle Geräte umbenennen muss? bzw. welche elegantere Lösung gibt es ggf?
2. Wie kann ich Geräte, die am gleichen Element hängen, zusammenfassen, so dass diese nicht doppelt ausgegeben werden, wie zB SRH und SWDM?

Mein Script sieht wie folgt aus:

Code: Alles auswählen

var sec=dom.GetObject("funcSecurity");
if (sec) {
 string i; string list; list="";
 foreach(i,sec.EnumUsedIDs()) {
  var channel=dom.GetObject(i);
  boolean isOn = false;
  if(channel.IsTypeOf(OT_CHANNEL)) {
   var dev=dom.GetObject(channel.Device());
   if(
(dev.HssType()=="HmIP-SWDO-I") ||
(dev.HssType()=="HmIP-SWDM") ||
(dev.HssType()=="HmIP-SRH")) {
    var state=channel.DPByHssDP("STATE");
    if (!state) {
     var level=channel.DPByHssDP("LEVEL");
     if (level.Value() > 0) {
      isOn = true;
     }
    } else {
     if(state.Value()) {
      isOn = true;
     }
    }
    if (isOn == true) {
     list=list#channel.Name()#"\n ";
    }
   }
  }
 }
 if (list.Length() > 2) {
  list = list.Substr(0,list.Length()-2);
 } else {
  list = "Alle Türen oder Fenster sind geschlossen.";
 }
} else {
  list = "FEHLER - GEWERK PRUEFEN!";
}
WriteLine(list);

string Alexa_fixed = "Folgende Türen oder Fenster sind offen!";
string Alexa_variabel = list;
string texttest = Alexa_fixed + Alexa_variabel;
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Alexa TTS Echo").State(texttest);
! Sprachausgabe auf Echo Flur
! -----------------------------------------------------------------------------------------------------------------------
string message = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Alexa TTS Echo").Value();
system.Exec("/usr/local/addons/alexa/alexa.sh -d 'Echo' -e speak:'" #message.ToUTF8() #"' &");
Danke für die Unterstützung.
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

MichaelN
Beiträge: 9684
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1627 Mal

Re: Strings in Liste im Script umwandeln

Beitrag von MichaelN » 26.05.2021, 13:02

mit .Split(".") kannst Du den String an den Punkten aufsplitten
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 +++

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

Re: Strings in Liste im Script umwandeln

Beitrag von Tyfys » 26.05.2021, 13:19

Hallo

Also die technischen Namen im String kann man einfach mit .Replace im String umbenennen.
Es werden damit gleich alle Vorkommen geändert.

Ich habe das bei mir zB. so gemacht:

Code: Alles auswählen

     message = message.Replace("FK_Ankleide_auf_Min", "Ankleidezimmerfenster");
     message = message.Replace("FK_Bad_auf_Min", "Badezimmerfenster");   
Ich weiss nicht, ob ich die zweite Frage richtig verstanden habe,
aber so kann man feststellen, ob ein Begriff im string enthalten ist :

Code: Alles auswählen

!wenn die suchvar noch nicht im string enthalten ist
if (listenstring.Find(suchvar) == -1)
{
    !nicht enthalten 
    !hier dann die Anhänge-Statements;
}

!oder wenn man auch die Position im String wissen muss:
string s = "Hallo Welt";
integer World = s.Find("Welt"); ! World = 6

!stellt auch nur fest:
boolean bWorld = s.Contains("Welt"); ! bWorld = true
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 » 26.05.2021, 19:01

Vielen Dank - mit replace hat es super geklappt. Bleibt noch die zweite Frage offen.

Ich habe beispielsweise folgende Umbenennung vorgenommen:

Code: Alles auswählen

list=list.Replace("I.DG.Buero.SRH:1", "Büro");
list=list.Replace("I.DG.Büro.Tür.Sensor:1", "Büro"); 
Die Ausgabe von Alexa ist dann natürlich: "Folgende Türen oder Fenster sind offen Büro Büro"

Als quick and dirty Lösung könnte ich natürlich bei .Tür.Sensor:1 das Replace mit "" vornehmen, da es eigentlich nicht vorkommen kann, dass der SRH geschlossen ist, aber der SWDO-I "offen" anzeigt.

Ich würde aber gerne verstehen, wie ich das programmtechnisch sauber zusammenführen kann, so dass Alexa sagt: "Folgende Türen oder Fenster sind offen Büro" - unabhängig davon, welcher der Sensoren jetzt die Meldung abgibt.

Danke
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

MichaelN
Beiträge: 9684
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1627 Mal

Re: Strings in Liste im Script umwandeln

Beitrag von MichaelN » 26.05.2021, 19:45

Quick and Dirty Idee

Code: Alles auswählen

integer Buero_merker = 0;
if (list.Find("I.DG.Buero.SRH:1") > (-1)) {
	list=list.Replace("I.DG.Buero.SRH:1", "Büro");
    Buero_merker = 1;
    }
if (Buero_merker == 1)
	{
	list=list.Replace("I.DG.Büro.Tür.Sensor:1", "");
    } else {
	list=list.Replace("I.DG.Büro.Tür.Sensor:1", "Büro");
    }        
    
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 +++

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

Re: Strings in Liste im Script umwandeln

Beitrag von Tyfys » 26.05.2021, 19:49

Hallo

Dann muss man die Umbenennung früher machen.

ich habe mal das script angepasst, wie ich es gemacht hätte ( ein Problem - drei Programmierer = 5 Lösungen ) :

Code: Alles auswählen

var sec=dom.GetObject("funcSecurity");
if (sec) {
 string i; string list; list="";
 foreach(i,sec.EnumUsedIDs()) {
  var channel=dom.GetObject(i);
  boolean isOn = false;
  if(channel.IsTypeOf(OT_CHANNEL)) {
   var dev=dom.GetObject(channel.Device());
   if(
(dev.HssType()=="HmIP-SWDO-I") ||
(dev.HssType()=="HmIP-SWDM") ||
(dev.HssType()=="HmIP-SRH")) {
    var state=channel.DPByHssDP("STATE");
    if (!state) {
     var level=channel.DPByHssDP("LEVEL");
     if (level.Value() > 0) {
      isOn = true;
     }
    } else {
     if(state.Value()) {
      isOn = true;
     }
    }
    if (isOn == true) {
        string ort = channel.Name();
        ort = ort.Replace("I.DG.Buero.SRH:1", "Büro");
        ort = ort.Replace("I.DG.Büro.Tür.Sensor:1", "Büro");
        !etc
        !dann prüfen ob der ort schon im string - wenn nicht hinzufügen
        if (list.Contains(ort) == false) {
            list = list # ort # "\n ";
        }
    }
   }
  }
 }
 if (list.Length() > 2) {
  list = list.Substr(0,list.Length()-2);
 } else {
  list = "Alle Türen oder Fenster sind geschlossen.";
 }
} else {
  list = "FEHLER - GEWERK PRUEFEN!";
}
WriteLine(list);

string Alexa_fixed = "Folgende Türen oder Fenster sind offen!";
string Alexa_variabel = list;
string texttest = Alexa_fixed + Alexa_variabel;
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Alexa TTS Echo").State(texttest);
! Sprachausgabe auf Echo Flur
! -----------------------------------------------------------------------------------------------------------------------
string message = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Alexa TTS Echo").Value();
system.Exec("/usr/local/addons/alexa/alexa.sh -d 'Echo' -e speak:'" #message.ToUTF8() #"' &");
Als Ergebnis könnte dann auch kommen z.B. ""Folgende Türen oder Fenster sind offen Büro Küche Dachzimmer".

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 » 27.05.2021, 18:01

Mal zum Verständnis als Zwischenfrage.
Wieso versucht man krampfhaft & dazu auch noch fehlerträchtig aus Kanalnamen etwas zu extrahieren statt entsprechende Daten wie z.B. Räume zu benutzen?

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

Re: Strings in Liste im Script umwandeln

Beitrag von Tyfys » 27.05.2021, 22:09

Hallo noch einmal

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.

Ich hatte für meine Zwecke die Variablennamen für eine gefälligere Telegramnachricht umbenannt.

Sollten also die entsprechenden Geräte/Kanäle eine Raum-Zuordnung haben,
könnten diese Statements

Code: Alles auswählen

                if (isOn == true) {
                    string ort = channel.Name();
                    ort = ort.Replace("I.DG.Buero.SRH:1", "Büro");
                    ort = ort.Replace("I.DG.Büro.Tür.Sensor:1", "Büro");
                    !etc
                    !dann prüfen ob der ort schon im string - wenn nicht hinzufügen
                    if (list.Contains(ort) == false) {
                        list = list # ort # "\n ";
                    }
                }

auch gegen diese ausgetauscht werden

Code: Alles auswählen

                if (isOn == true) {
                    string Raum = dom.GetObject(channel.ChnRoom()).Name();
                    !dann prüfen ob der Raum schon im string - wenn nicht hinzufügen
                    if (list.Contains(Raum) == false) {
                        list = list # Raum # "\n ";
                    }
                }
Hat auch den Vorteil, daß bei neu hinzukommenden Geräten nur der der Raum mit eingepflegt werden muss.
Am Script wäre dann auch nichts mehr zu ändern.

Evtl. hat Alchy ja noch eine bessere Idee.

Ich bin immer lernwillig.

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 » 28.05.2021, 08:50

Hallo,

das mit den Räumen ist eine sehr gute Idee. Ehrlich gesagt habe ich darüber nicht nachgedacht. Ich werde es mal ausprobieren.
Danke für den Input.

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

MichaelN
Beiträge: 9684
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1627 Mal

Re: Strings in Liste im Script umwandeln

Beitrag von MichaelN » 28.05.2021, 09:17

Und ich dachte Du wolltest das absichtlich nicht.
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 +++

Antworten

Zurück zu „HomeMatic allgemein“