Servicemeldungen SV v3.15 (stable)

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

Moderator: Co-Administratoren

Benutzeravatar
JRiemann
Beiträge: 3903
Registriert: 12.11.2015, 21:05
Wohnort: Aurich
Danksagung erhalten: 3 Mal

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von JRiemann » 02.11.2017, 12:52

Ok. danke für die Erklärung!
Da mein Hauptwunsch erfüllt worden ist kann ich mit der leichten Einschränkung gut leben.
Viele Grüße!
Jörg

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von blackhole » 02.11.2017, 14:07

JRiemann hat geschrieben:Ok. danke für die Erklärung!
Gerne geschehen.
JRiemann hat geschrieben:Da mein Hauptwunsch erfüllt worden ist kann ich mit der leichten Einschränkung gut leben.
Falls Du die leichte Einschränkung noch wegoptimieren möchtest:

Die gesuchte Methode für die Ermittlung der Bezeichnung eines Zahlenwertes einer Werteliste nennt sich web.webGetValueFromList() (siehe > hier* <).
Der Code-Schnippsel in dem verlinkten Beitrag ist sehr gut erklärt und kommentiert, so dass Du damit klarkommen solltest.

*Ich wusste doch, dass ich da schon einmal drüber gestolpert bin.

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

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von alchy » 02.11.2017, 14:51

Es gibt sogar mindestens 2 Möglichkeiten

Code: Alles auswählen

WriteLine( web.webGetValueFromList((dom.GetObject(ID_SYSTEM_VARIABLES).Get("WERTELISTE")).ValueList(), (dom.GetObject(ID_SYSTEM_VARIABLES).Get("WERTELISTE")).Value()) );

Code: Alles auswählen

WriteLine( (dom.GetObject(ID_SYSTEM_VARIABLES).Get("WERTELISTE").ValueList() ).StrValueByIndex(";",dom.GetObject(ID_SYSTEM_VARIABLES).Get("WERTELISTE").Value()) );
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.

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von blackhole » 02.11.2017, 16:34

Ich schätze, dass BadenPower noch mit mindestens einer dritten Möglichkeit um die Ecke kommen könnte (falls die nicht gerade kaputtrepariert wurde). :mrgreen:

Benutzeravatar
JRiemann
Beiträge: 3903
Registriert: 12.11.2015, 21:05
Wohnort: Aurich
Danksagung erhalten: 3 Mal

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von JRiemann » 02.11.2017, 18:33

Die beiden von Alchy gezeigten Methoden geben leider nur immer den 1. Wert der Wertliste zurück...
Viele Grüße!
Jörg

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

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von alchy » 02.11.2017, 19:42

Logisch, war was anderes gefragt?

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.

Benutzeravatar
JRiemann
Beiträge: 3903
Registriert: 12.11.2015, 21:05
Wohnort: Aurich
Danksagung erhalten: 3 Mal

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von JRiemann » 02.11.2017, 20:08

Mein Wunsch ist es Geräte die in einer Variable von Typ Wertliste hinterlegt sind im Servicemeldungenskript zu nutzen um damit "var blockdevices" zu füttern...
Mit einer Variable vom Typ Zeichenkette funktioniert es mit:
var blockdevices = dom.GetObject(ID_SYSTEM_VARIABLES).Get("DEINE_SYSVAR_MIT_GERAETENAMEN").Value();

Bei der Variable vom Typ Wertliste funktioniert es leider nicht..

Ich würde gerne die Wertliste nutzen da ich diese Variable mit "Winterschlaf-Geräten" bereits verwende. Ich nutze auch noch das BadenPower "Winterschlaf-Skript" und für dieses ist die Trennung der einzelnen Geräte per Semikolon notwendig. Bei "Servicemeldungen SV" und "Servicemeldungen allinclusive" ist aber eine Trennung der Geräte per Leerschritt erforderlich...

Sollte die Umsetzung zu aufwändig sein kann ich mit diesem "Schönheitsfehler" gut leben. Ich werde dann einfach eine Wertliste und eine Zeichenkette mit den Gerätelisten füttern...
Viele Grüße!
Jörg

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

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von alchy » 02.11.2017, 21:21

Und nun willst du alle Werte der Werteliste?

Code: Alles auswählen

WriteLine((dom.GetObject(ID_SYSTEM_VARIABLES).Get("WERTELISTE")).ValueList());
gibt dir halt alle Werte aus.
Dazu müsste ich mir ja erst mal ein "fremdes" Script anschauen.
blackhole hat geschrieben: Ich schätze, dass BadenPower noch mit mindestens einer dritten Möglichkeit um die Ecke kommen könnte (falls die nicht gerade kaputtrepariert wurde).
Selbst wenn er eine wüsste, und das wäre nicht mal abwegig, er >könnte nicht mehr helfen<.

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.

Benutzeravatar
blackhole
Beiträge: 3730
Registriert: 21.07.2015, 14:03
System: CCU
Hat sich bedankt: 184 Mal
Danksagung erhalten: 587 Mal

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von blackhole » 02.11.2017, 21:38

alchy hat geschrieben:Selbst wenn er eine wüsste, und das wäre nicht mal abwegig, er >könnte nicht mehr helfen<
Ich habe es schon gesehen. Unfassbar.

Benutzeravatar
JRiemann
Beiträge: 3903
Registriert: 12.11.2015, 21:05
Wohnort: Aurich
Danksagung erhalten: 3 Mal

Re: Servicemeldungen SV v2.22 (stable)

Beitrag von JRiemann » 02.11.2017, 21:59

Genau, in der Wertliste stehen aktuell 3 Geräte die ungenutzt sind.
Diese Geräte sollen im Servicemeldungen-Skript als geblockte Geräte erkannt werden (var blockdevices).
Ich möchte diese Geräte nicht direkt ins Skript eintragen weil die Geräte öfter wechseln und es per Variable komfortabler ist.
Mit dieser Zeile funktioniert es mit einer Variable vom Typ Zeichenkette:

Code: Alles auswählen

var blockdevices = dom.GetObject(ID_SYSTEM_VARIABLES).Get("DEINE_SYSVAR_MIT_GERAETENAMEN").Value();
Mit einer Variable vom Typ Wertliste funktioniert es im Servicemeldungenskript nicht.

Ich möchte einerseits das BadenPower Skript und andererseits Dein bzw.das Skript von blackhole nutzen.
Und dann aus einer Variable heraus die zu blockenden Geräte abfragen.

Code: Alles auswählen

    !Servicemeldungen best‰tigen V2.0.2
    !**********************************
    !www.homematic-forum.de (c) by BadenPower

    string lScriptName = "Servicemeldungen best‰tigen V2.0.2";
    boolean hB1 = true;  !zus‰tzlich auch alle STICKY_UNREACH-Meldungen von aktiven Ger‰ten lˆschen
    string hS1 = "/usr/local/xmlrpc_event.tcl"; !Pfad zum TCL-Skript inkl. Dateiname

    string lON1 = "";
    if(system.IsVar("lON1")){
    lON1 = lON1 # "SYS-Protokoll";
    lON1 = lON1 # ";" # "SYS-Ger‰te-Inaktiv";
    lON1 = lON1 # ";" # "IST-Servicemeldungen-gelˆscht-Aktiv";
    lON1 = lON1 # ";" # "IST-Servicemeldungen-gelˆscht-Inaktiv";
    }

    ! ----- Ende Einstellungen -----

    !-----Variabeln deklarieren
    string lCO1 = "";
    boolean lDoNextStep = false;
    string lGetOut1 = "";
    string lGetErr1 = "";
    object lProtocol = null;
    string lSP1 = "";
    integer z1 = 0;

    integer hI1 = 2;
    object hO1 = dom.GetObject(ID_SYSTEM_VARIABLES);
    object hO2 = dom.GetObject(ID_SERVICES);
    string hS2 = "http://127.0.0.1:1999/";
    string hS3 = "";
    boolean tB1 = false;
    boolean tB2 = false;
    integer tI1 = 0;
    integer tI2 = 0;
    integer tI3 = 0;
    object tO1 = null;
    object tO2 = null;
    object tO3 = null;
    object tO4 = null;
    object tO5 = null;
    object tO6 = null;
    string tS1 = "";
    string tS2 = "";
    string tS3 = "";
    string tS4 = "";

    !Systemvariable-Objekte pr¸fen
    z1 = 0;
    foreach(lSP1,lON1.Split(";"))
    {
      tS1 = "0-0-0";
      if(lSP1 <> "")
      {
        tO1 = hO1.Get(lSP1);
        if(tO1)
        {
          ! hier Sonderpr¸fungen anlegen / in diesem Skript nicht benˆtigt daher (z1 == -1)
          if(z1 == -1)
          {
            tS1 = "1";
            if((tO1.Value() == null) || (tO1.Value() == "") || (tO1.Value() == "???"))
            {
              tS1 = tS1 # "-0";
            }
            else
            {
              tS1 = tS1 # "-1";
            }
            ! hier Sonderpr¸fungen2 anlegen / wird in diesem Skript nicht benˆtigt daher (z1 == -1)
            if(z1 == -1)
            {
              if(tO1.Timestamp())
              {
                tS1 = tS1 # "-1";
              }
              else
              {
                tS1 = tS1 # "-0";
              }
            }
          }
          else
          {
            tS1 = "1-0-0";
          }
        }
      }
      if(z1 > 0)
      {
        lCO1 = lCO1 # ";";
      }
      lCO1 = lCO1 # tS1;
      z1 = z1 + 1;
    }

    lDoNextStep = true;

    if(lDoNextStep)
    {
      if(((lCO1.StrValueByIndex(";",0)).StrValueByIndex("-",0)).ToInteger() > 0)
      {
        lProtocol = hO1.Get(lON1.StrValueByIndex(";",0));
      }
    }

    if(lDoNextStep)
    {
      lDoNextStep = false;
      tO1 = dom.GetObject(41);
      if(tO1)
      {
        if(tO1.Value() > 0)
        {
          lDoNextStep = true;
        }
      }
    }

    if(lDoNextStep)
    {
      if(((lCO1.StrValueByIndex(";",1)).StrValueByIndex("-",0)).ToInteger() > 0)
      {
        tO1 = hO1.Get(lON1.StrValueByIndex(";",1));
        if((tO1.ValueType() == ivtInteger) && (tO1.ValueSubType() == istEnum))
        {
          hS3 = tO1.ValueList();
        }
        else
        {
          hS3 = tO1.Value();
        }
      }
     
      if((hB1 == false) && ((hS3 == "") || (hS3 == "-")))
      {
        lDoNextStep = false; 
      }
    }

    if(lDoNextStep)
    {
      foreach(lSP1,hO2.EnumIDs())
      {
        tO1 = hO2.Get(lSP1);
        if(tO1)
        {
          if((tO1.AlType() == atService) && (tO1.AlState() == asOncoming))
          {
            tI1 = tO1.AlTriggerDP();
            if(tI1 <> ID_ERROR)
            {
              tO2 = dom.GetObject(tI1);
              if(tO2)
              {
                tB1 = false;
                tB2 = false;
                tI2 = 0;
                tS1 = tO2.HssType();
                tS2 = tO2.Name();
                tO3 = dom.GetObject(tO2.Channel());
                if(tO3)
                {
                  tO4 = dom.GetObject(tO3.Device());
                  if(tO4)
                  {
                    tS2 = tO4.Name();
                    tO5 = dom.GetObject(tO4.Interface());
                    if((hS3 <> "") && (hS3 <> "-"))
                    {
                      foreach(lSP1,hS3.Split(";"))
                      {
                        if(lSP1 == tO4.Address())
                        {
                          tB1 = true;
                        }
                      }
                    }
                  }
                }

                if((tB1) || ((hB1) && (tS1 == "STICKY_UNREACH")))
                {
                  if(tS1 == "STICKY_UNREACH")
                  {
                    tO1.AlReceipt();
                    tB2 = true;
                  }
                  else
                  {
                    if((tS1 == "UNREACH") || (tS1 == "ERROR"))
                    {
                      if(tO5)
                      {
                        tI2 = tO2.Operations();
                        if(true)
                        {
                          tO2.Operations(7);
                          tO2.State(0);
                          tS3 = "string";
                          if(tO2.ValueType() == ivtBinary) { tS3 = "bool"; }
                          if(tO2.ValueType() == ivtInteger) { tS3 = "int"; }
                          tS4 = "tclsh " # hS1 # " " # hS2 # " " # tO5.Name() # " " # tO3.Address() # " " # tS1 # " " # tS3 # " 0";
                          system.Exec(tS4,&lGetOut1,&lGetErr1);
                          tB2 = true;
                        }
                        tO2.Operations(tI2);
                      }
                    }
                  }
                  if(tB2)
                  {
                    if(lProtocol)
                    {
                      lProtocol.State("Servicemeldung " # tS1 # " best‰tigt: " # tS2);
                    }
                    tI2 = hI1;
                    if(tB1)
                    {
                      tI2 = hI1 + 1;
                    }
                    if(((lCO1.StrValueByIndex(";",tI2)).StrValueByIndex("-",0)).ToInteger() > 0)
                    {
                      tO6 = hO1.Get(lON1.StrValueByIndex(";",tI2));
                      tI3 = tO6.Value();
                      if(tI3 == 1000000) { tI3 = 0; }
                      tO6.State(tI3 + 1);
                    }
                  }
                }
              }
            }
          }
        }
      }
    }

    ! erreichen des Skript-Ende protokollieren
    if(lProtocol)
    {
      lProtocol.State("Skript beendet: " # lScriptName);
    }
Viele Grüße!
Jörg

Antworten

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