FHEM Forum

FHEM - Hausautomations-Systeme => Homematic => Thema gestartet von: PatrickR am 27 Dezember 2020, 01:49:27

Titel: hmscript nonBlocking
Beitrag von: PatrickR am 27 Dezember 2020, 01:49:27
Guten Abend zusammen!

Ich benutze hmscript und die Rückgabe von key=value-Paaren zum Setzen eines Readings meiner ccus. Leider benötigt das Skript etwa 2 Sekunden Zeit und blockiert so lange FHEM. Besteht die Möglichkeit, ein Skript nonBlocking auszuführen? Ich würde dann eine Systemvariable im Hintergrund setzen und sie per get vars abholen.

Grüße
Patrick
Titel: Antw:hmscript nonBlocking
Beitrag von: zap am 27 Dezember 2020, 11:03:25
Das sollte funktionieren, wenn Du im Attribut ccuflags vom I/O Device das Flag "noBlocking" setzt.

Welche Readings sind das denn, die Du per Script abholen musst? Normalerweise liefert Dir die CCU die "normalen" Readings per RPC Server automatisch an.
Titel: Antw:hmscript nonBlocking
Beitrag von: PatrickR am 27 Dezember 2020, 16:30:26
Hi!
Zitat von: zap am 27 Dezember 2020, 11:03:25
Das sollte funktionieren, wenn Du im Attribut ccuflags vom I/O Device das Flag "noBlocking" setzt.
nonBlocking ist auf dem HMCCU-Device gesetzt. Dennoch kommt es reproduzierbar zu Freezes:

So 27.12.2020 16:28:38  freezemon s:16:28:35 e:16:28:38 f:3.089 d:cmd-set rpiccu hmscript hmscripts/GetRepeaters.scr(WWW) fn-SetFn(rpiccu) fn-ReadFn(WWW_172.17.0.6_54200)
So 27.12.2020 16:28:33  freezemon s:16:28:31 e:16:28:33 f:2.96 d:cmd-set rpiccu hmscript hmscripts/GetRepeaters.scr(WWW) fn-SetFn(rpiccu) fn-ReadFn(WWW_172.17.0.6_54194)
So 27.12.2020 01:32:38  freezemon s:01:32:36 e:01:32:38 f:2.719 d:cmd-set rpiccu hmscript hmscripts/getRepeaters.scr(WWW) fn-SetFn(rpiccu) fn-ReadFn(WWW_172.17.0.6_42026)


Zitat von: zap am 27 Dezember 2020, 11:03:25
Welche Readings sind das denn, die Du per Script abholen musst? Normalerweise liefert Dir die CCU die "normalen" Readings per RPC Server automatisch an.
Das stimmt. Leider sind es keine normalen Readings - warum auch immer eq3 nicht alle Readings direkt nutzbar macht. Ich werte ROUTER_MODULE_ENABLED aus.

Patrick
Titel: Antw:hmscript nonBlocking
Beitrag von: zap am 27 Dezember 2020, 16:46:53
Wie sieht das Script aus?
Titel: Antw:hmscript nonBlocking
Beitrag von: PatrickR am 27 Dezember 2020, 16:50:13
Zitat von: zap am 27 Dezember 2020, 16:46:53
Wie sieht das Script aus?
Ich hoffe, Du sitzt:


object oHmIp= interfaces.Get("HmIP-RF");
if (!oHmIp) { WriteLine("HmIP-RF nicht verfügbar!"); quit; }
string sID;
string sRepeaters = "";
foreach (sID, devices.EnumUsedIDs()) {
  object oDev = devices.Get(sID);
  if ((oDev.Interface()==oHmIp.ID()) && ((oDev.HssType() == "HMIP-PSM") || (oDev.HssType() == "HMIP-PS") || (oDev.HssType() == "HmIP-PCBS") || (oDev.HssType() == "HmIP-HAP"))) {
    !- GetParamset Zuweisung Masterset vom SDV V4.05.05G LCL für Gerät: HMIP-PSM
    string stdErr=""; string stdOut="";
    string sTCL= ^set p [xmlrpc ^ # oHmIp.InterfaceUrl() # ^/ getParamset [list string \"^#oDev.Address ()#^:0\"] [list string \"MASTER\"]]; set r \"\"; ^;
    sTCL= sTCL # "regexp {\sROUTER_MODULE_ENABLED ([0-9]*)} \$p matched sub1 ; append r \$sub1 \\t; ";
    sTCL= sTCL # "puts \$r;";
    system.Exec ("/bin/sh -c 'echo \"load tclrpc.so; " # sTCL # "\" |tclsh'",&stdOut,&stdErr);
    if (!stdErr) {
      !- stdErr kein Leerstring: Fehler ist aufgetreten
      !- Generierter Beispielcode für den Zugriff auf die ausgesuchten Parameter
      boolean ROUTER_MODULE_ENABLED= (stdOut.StrValueByIndex ("\t",0)=="1");
      if (ROUTER_MODULE_ENABLED) {
        ! WriteLine (oDev.Name() # " ["# oDev.HssType() #"]");
        if (sRepeaters == "") {
          sRepeaters = oDev.Name();
        } else {
          sRepeaters = sRepeaters # "," # oDev.Name();
        }
      }
    }
  }
}
WriteLine("repeaters=" # sRepeaters);

Es ist nicht von mir, ich habe es lediglich angepasst. Der Ansatz, durch system.exec und xmlrpc an den Wert zu kommen, ist schon sehr gewöhnungsbedürftig.

Patrick
Titel: Antw:hmscript nonBlocking
Beitrag von: BadenPower am 28 Dezember 2020, 21:49:37
Hallo,

das ist nicht unbedingt gewohnheitsbedürtig, sondern einer der normalen Ansatzpunkte um diesen Wert zu lesen, da es sich nicht um einen Datenpunkt handelt, sondern um einen Kofigurationswert aus dem Paramterset MASTER.

Wenn Du auf system.Exec() und TCL verzichten möchtest, dann mußt Du im Skript via xmlrpc.GetParamset() das komplette Parameterset holen und dann im Skript selbst für die Aufbereitung des Wertes ROUTER_MODULE_ENABLED sorgen.

Beachte allerdings dass beide Vorgehensweise immer den DutyCycle beanspruchen, da bei beiden Varianten immer das komplette Paramerset von den betroffenen Aktoren übertragen wird.

.
Titel: Antw:hmscript nonBlocking
Beitrag von: PatrickR am 29 Dezember 2020, 00:33:37
Hi!

Zitat von: BadenPower am 28 Dezember 2020, 21:49:37
das ist nicht unbedingt gewohnheitsbedürtig, sondern einer der normalen Ansatzpunkte um diesen Wert zu lesen, da es sich nicht um einen Datenpunkt handelt, sondern um einen Kofigurationswert aus dem Paramterset MASTER.
Ich hatte mal einen SAT-Receiver, da war es der anerkannte Weg, den Inhalt des LCD durch das Spawnen eines cURL-Prozesses zu ändern, der einen GET-Request auf den lokalen Webserver abfeuert. Das macht es nicht weniger gewöhnungsbedürftig. Und das ist noch milde ausgedrückt. Aber Deine Botschaft ist wohl eher, dass es der beste bekannte Workaround ist.

Unabhängig davon: Danke für den Hinweis, dass das Skript den Duty Cycle hochtreibt. Das war mir bislang nicht bekannt und ich werde es bei der Frequenz der Abfrage berücksichtigen.

Patrick
Titel: Antw:hmscript nonBlocking
Beitrag von: zap am 29 Dezember 2020, 12:07:07
Warum nicht "get config"? HMCCU verwendet dann die RPC Schnittstelle der CCU statt Rega.
Der liest das Paramset MASTER. Mit der Version 4.4 sogar das Paramset LINKS.

Wenn Du ein HMCCUDEV xy hast und der Parameter in Kanal 0 vorhanden ist, wäre der Befehl:

get xy config 0 ROUTER_MODULE_ENABLED

Übrigens: bei meiner IP Steckdose heißt der Parameter MULTICAST_ROUTER_MODULE_ENABLED
Titel: Antw:hmscript nonBlocking
Beitrag von: PatrickR am 29 Dezember 2020, 15:38:00
Hi!

Zitat von: zap am 29 Dezember 2020, 12:07:07
Warum nicht "get config"? HMCCU verwendet dann die RPC Schnittstelle der CCU statt Rega.
Der liest das Paramset MASTER. Mit der Version 4.4 sogar das Paramset LINKS.

Wenn Du ein HMCCUDEV xy hast und der Parameter in Kanal 0 vorhanden ist, wäre der Befehl:

get xy config 0 ROUTER_MODULE_ENABLED
Sieht gut aus. Das Reading R-0.ROUTER_MODULE_ENABLED wird gesetzt.
Gibt es einen Standardweg, das Reading automatisch zu aktualisieren (abgesehen von einem AT o. ä.?)

Zitat von: zap am 29 Dezember 2020, 12:07:07
Übrigens: bei meiner IP Steckdose heißt der Parameter MULTICAST_ROUTER_MODULE_ENABLED
Bei meiner HmIP-PS gibt es beide Varianten, wobei ROUTER_MODULE_ENABLED den korrekten Wert ausgibt:

get UG.AZ.Repeater configlist 0 .*ROUTER_MODULE_ENABLED.*
ROUTER_MODULE_ENABLED=1
MULTICAST_ROUTER_MODULE_ENABLED=0


Grüße
Patrick

/Edit: Hatte übersehen, dass das Reading automatisch angelegt wird.