hmscript nonBlocking

Begonnen von PatrickR, 27 Dezember 2020, 01:49:27

Vorheriges Thema - Nächstes Thema

PatrickR

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
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

zap

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.
2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

PatrickR

#2
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
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

zap

2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

PatrickR

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
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

BadenPower

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.

.
Zitat eines Users per PN:
Die Dummheit eines Forums, vor allem deren Nutzer, läßt sich daran ablesen, wie oft Personen als Troll bezeichnet werden, wenn sie offenkundige Fehlverhalten von anderen Benutzern öffentlich machen.

PatrickR

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
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

zap

#7
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
2xCCU3 mit ca. 100 Aktoren, Sensoren
Entwicklung: FHEM auf Proxmox Debian VM
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: HMCCU, (Fully, AndroidDB)

PatrickR

#8
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.
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook