Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

xmlrpc.PutParamset mit COMBINED_PARAMETER funktioniert nicht #1769

Open
Baxxy13 opened this issue Mar 20, 2022 · 16 comments
Open

xmlrpc.PutParamset mit COMBINED_PARAMETER funktioniert nicht #1769

Baxxy13 opened this issue Mar 20, 2022 · 16 comments
Labels
⚓ upstream issue This is a bug/issue for/in upstream software (OCCU, etc.) 🐛 bug-report Something isn't working 🏷️ HmIPServer This refs the HmIPServer component

Comments

@Baxxy13
Copy link
Contributor

Baxxy13 commented Mar 20, 2022

Describe the issue you are experiencing

Die COMBINED_PARAMETER diverser IP-Aktoren eignen sich gut um mehrere Befehle in einem Rutsch zu übertragen.
(z.B. EINschalten mit EINschaltdauer)

Jetzt ist mir aufgefallen das xmlrpc.PutParamset angewandt auf einen COMBINED_PARAMETER - Datenpunkt nicht funktioniert und eine Fehlermeldung wirft.

Als Testobjekt dient Kanal:3 einer HmIP-PSM:

EINschalten über Datenpunkt STATE geht:

object interface = dom.GetObject("HmIP-RF");
xmlrpc.PutParamset(interface,"0001D3C99CA0D2:3","VALUES","STATE","true");

EINschalten über Datenpunkt COMBINED_PARAMETER geht nicht:

object interface = dom.GetObject("HmIP-RF");
xmlrpc.PutParamset(interface,"0001D3C99CA0D2:3","VALUES","COMBINED_PARAMETER","S=true");

Describe the behavior you expected

Idealerweise ließe sich auch der COMBINED_PARAMETER mittels xmlrpc.PutParamset setzen.

Steps to reproduce the issue

  1. Aktor mit COMBINED_PARAMETER rauspicken
  2. obiges Script anpassen und testen
  3. Fehlermeldungen im Logfile sehen
    ...

What is the version this bug report is based on?

3.61.7.20220318 - Nightly

Which base platform are you running?

rpi3 (RaspberryPi3)

Which HomeMatic/homematicIP radio module are you using?

RPI-RF-MOD

Anything in the logs that might be useful for us?

Mar 20 14:11:43 RM-Test-Pi3Bplus-27 local0.warn ReGaHss: WARNING: XMLRPC 'putParamset': rpcClient.isFault() failed (url: xmlrpc://127.0.0.1:32010, params: {"0001D3C99CA0D2:3","VALUES",[COMBINED_PARAMETER:nil]}, result: [faultCode:-5,faultString:"Invalid parameter or value"]) [CallXmlrpcMethod():iseXmlRpc.cpp:2608]
Mar 20 14:11:43 RM-Test-Pi3Bplus-27 local0.err ReGaHss: ERROR: XMLRPC 'putParamset' call failed (interface: 1009, params: {"0001D3C99CA0D2:3","VALUES",[COMBINED_PARAMETER:nil]}) [CallPutParamset():iseXmlRpc.cpp:1356]

Additional information

Ich habe es auch mit externen Steuerungen wie Homassistant (siehe hier) und auch NodeRed probiert.

NodeRed wirft z.B. folgende Fehlermeldungen aus:
unknown paramsetDescription HmIP-RF/HMIP-PS/2.6.2/4/SWITCH_VIRTUAL_RECEIVER/VALUES COMBINED_PARAMETER
Error: XML-RPC fault: Invalid parameter or value

Bin mir nicht sicher ob es ein Bug ist, das ganze gar nicht implementiert ist oder ich den Wert falsch übergebe.

Das ganze hat eigentlich keine Relevanz, aber vielleicht wirfst du trotzdem mal irgendwann einen Blick drauf.

@Baxxy13 Baxxy13 added the 🐛 bug-report Something isn't working label Mar 20, 2022
@jp112sdl
Copy link
Contributor

Ist PutParamset nicht dafür gedacht, Einstellungen ans Gerät zu senden?

Wäre das Einschalten nicht so?
channels.Get ("0001D3C99CA0D2:3").DPByHssDP ("COMBINED_PARAMETER").State("S=true");

@Baxxy13
Copy link
Contributor Author

Baxxy13 commented Mar 21, 2022

Hmm, ich lese die Beschreibung von putParamset (Doku: HMIP_XmlRpc_API_Addendum) so, das damit alle Parameter in einem Parameter-Set (egal ob MASTER oder VALUES) geschrieben werden können. Also auch "normale" Parameter wie STATE oder ON_TIME.
Das klappt ja grundsätzlich auch, nur bei COMBINED_PARAMETER eben nicht.

Lokal auf der Zentrale per (ReGa-) Scriptbefehl (wie von Dir gezeigt) ist das kein Problem den COMBINED_PARAMETER korrekt zu beschreiben.

Externe Anwendungen (Beispiel NodeRED) unterstützen den COMBINED_PARAMETER auf "normalem Wege" (value node, set value node) gar nicht, aber man kann eben auf die universelle rpc node (man wählt die rpc-Methode und übergibt die Parameter) ausweichen. Aber auch mit der funktioniert COMBINED_PARAMETER per putParamset nicht.

Was aber geht ist setValue, damit kommen Homeassistant und auch die (NodeRed) rpc node klar.

@jens-maus
Copy link
Owner

Externe Anwendungen (Beispiel NodeRED) unterstützen den COMBINED_PARAMETER auf "normalem Wege" (value node, set value node) gar nicht, aber man kann eben auf die universelle rpc node (man wählt die rpc-Methode und übergibt die Parameter) ausweichen. Aber auch mit der funktioniert COMBINED_PARAMETER per putParamset nicht.

Also ohne das ich das jetzt genauer debugged habe, aber über ioBroker scheint das einfache setzen des COMBINED_PARAMETER zu funktionieren. Dort kann ich im Objektbaum einfach S=true eingeben und schwubs wird der Schalter angeschalten. Nun weiss ich aber natürlich nicht über welche Methoden (xmlrpc oder anders) das in ioBroker gemacht wird. Meine Vermutung ist aber (weil das im Kontext des hm-rpc adapters stattfindet), das es dort in der Tat via xmlrpc passiert und das zeigt das es prinzipiell gehen muss. Ggf. muss man jedoch da irgendwas "escapen" oder so ähnlich. Aber vllt. probierst du es mal selbst via ioBroker zu debuggen.

@Baxxy13
Copy link
Contributor Author

Baxxy13 commented Mar 21, 2022

Ich denke ioBroker nutzt für Statusänderungen setValue, zumindest liest sich das hier so:
Custom commands

Set a value, like the adapter does on stateChange:

sendTo('hm-rpc.1', 'setValue', {ID: '000453D77B9EDF:1', paramType: 'SET_POINT_TEMPERATURE', params: 15}, res => {
    log(JSON.stringify(res));
});

setValue funktioniert ja auch mit Homeassistant und NodeRed.

Es gibt auch ein Beispiel für putParamset, aber ich bekomme weder das noch setValue über ein Java-Script zum laufen.
Komme also nicht so recht voran.

@Sineos
Copy link

Sineos commented Mar 21, 2022

Das hat bei mir in Node-Red funktioniert:
rdmtc/node-red-contrib-ccu#142 (comment)

Zumindest als ich das das letzte Mal getestet habe.

@Baxxy13
Copy link
Contributor Author

Baxxy13 commented Mar 21, 2022

Nunja, putParamset funktioniert auch bei allen von mir getesteten änderbaren Datenpunkten / Werten...
außer eben bei COMBINED_PARAMETER bei IP-Aktoren.

Kannst du aber gerne mal testen wenn du z.B. PS/PSM/BSL (mit COMBINED_PARAMETER) usw. hast.

@Baxxy13
Copy link
Contributor Author

Baxxy13 commented Mar 21, 2022

Also der ioBroker packt das auch nicht mit putParamset und COMBINED_PARAMETER

sendTo('hm-rpc.1', 'putParamset', {ID: '00021A498A4C88:3', paramType: 'VALUES', params: {'COMBINED_PARAMETER': 'S=true,OT=23'}}, res => {
    log(JSON.stringify(res));
});

19:30:44.520 | info | javascript.0 (6644) script.js.Skript_7: {"error":{"code":-5,"faultCode":-5,"faultString":"Invalid parameter or value"}}

Möglicherweise muss tatsächlich der String irgendwie escaped werden, da muss ich aber passsen.
Oder putParamset wurde nicht an COMBINED_PARAMETER angepasst und funktioniert damit schlicht nicht weil halt ein String übergeben werden muss und nicht wie üblicherweise BOOLEAN / INTEGER / REAL.

@jens-maus
Copy link
Owner

Gibt es denn sowas wie COMBINED_PARAMETER nur bei HmIP? Weil ich könnte mir gut vorstellen das das ein Bug bzw. Limitation der Legacy XMLRPC schnittstelle im HmIPServer ist. Wenn man also einen Fall finden könnte wo solch ein string-basierter Parameter via xmlrpc an rfd/bidcos oder hs485d geschickt werden kann, dann hätte man dafür ein Ansatzpunkt.

@Baxxy13
Copy link
Contributor Author

Baxxy13 commented Mar 21, 2022

Da fällt mir aktuell nur der SUBMIT vom HM-Dis-EP-WM55 ein. Da wird auch String etwa so...
0x02,0x0A,0x12,0x49,0x4E,0x3A,0x20... übergeben.
Muss ich mal schauen ob das per putParamset geht.
Der COMBINED_PARAMETER wurde ja auch erst nach und nach bei diversen Geräten eingeführt und hat es bisher nicht mal in die offizielle HmIP_Device_Documentation geschafft.

@Baxxy13
Copy link
Contributor Author

Baxxy13 commented Mar 21, 2022

Also, der SUBMIT vom HM-Dis-EP-WM55 lässt sich via putParamset mit einem String beschreiben. Das klappt mit ioBroker und Homeasistant, mit HM-Script bekomme ich es nicht hin. Vermutlich wieder so eine Escaping-Geschichte.
Beispiel aus ioBroker:

sendTo('hm-rpc.0', 'putParamset', {ID: 'NEQ1463378:3', paramType: 'VALUES', params: {'SUBMIT': '0x02,0x0A,0x12,0x49,0x4E,0x3A,0x20,0x32,0x32,0x2C,0x30,0x5e,0x43,0x0A,0x12,0x54,0x6F,0x72,0x3A,0x20,0x7A,0x75,0x13,0x83,0x0A,0x12,0x4F,0x75,0x74,0x3A,0x20,0x36,0x2C,0x35,0x5e,0x43,0x0A,0x14,0xC0,0x1C,0xD1,0x1D,0xE0,0x16,0xF0,0x03'}}, res => {
    log(JSON.stringify(res));
});

@jp112sdl
Copy link
Contributor

jp112sdl commented Mar 21, 2022

Ich hab ja nur ein PCBS in meinem HmIP Fuhrpark.
Aber wenn ich auf dem mal ein getParamset für VALUES und für MASTER mache, sehe ich beim ersten nix mit COMBINED_PARAMETER:

echo 'load tclrpc.so; puts [xmlrpc xmlrpc://127.0.0.1:32010/ getParamset [list string "000457098CEFA9:3"] [list string "VALUES"]  ]' |tclsh
PROCESS 0 SECTION 2 SECTION_STATUS 0 STATE 1

echo 'load tclrpc.so; puts [xmlrpc xmlrpc://127.0.0.1:32010/ getParamset [list string "000457098CEFA9:3"] [list string "MASTER"]  ]' |tclsh
COMBINED_PARAMETER {"S=true"} LOGIC_COMBINATION 1 POWERUP_JUMPTARGET 1 POWERUP_ONDELAY_UNIT 0 POWERUP_ONDELAY_VALUE 0 POWERUP_ONTIME_UNIT 0 POWERUP_ONTIME_VALUE 0

VALUES kann (beim PCBS) nur STATE.
MASTER kann COMBINED_PARAMETER

@Baxxy13
Copy link
Contributor Author

Baxxy13 commented Mar 21, 2022

Hmm, klappt leider auch nicht mit MASTER als paramset_key.

sendTo('hm-rpc.1', 'putParamset', {ID: '00021A498A4C88:3', paramType: 'MASTER', params: {'COMBINED_PARAMETER': 'S=true,OT=22'}}, res => {
    log(JSON.stringify(res));
}); 

23:00:43.524 | info | javascript.0 (6644) script.js.Skript_8: {"error":{"code":-5,"faultCode":-5,"faultString":"Invalid parameter or value"}}

Da ist was faul und ich bin kurz vor'm aufgeben.
Glücklicherweise geht's ja mit setValues.

@jp112sdl
Copy link
Contributor

Und wenn du
'{S=true,OT=22}'
übergibst?

@Baxxy13
Copy link
Contributor Author

Baxxy13 commented Mar 21, 2022

Keine Chance, selber Fehler wie eins über dir bei MASTER und VALUES.

@jens-maus jens-maus added 🏷️ HmIPServer This refs the HmIPServer component ⚓ upstream issue This is a bug/issue for/in upstream software (OCCU, etc.) labels Apr 2, 2022
@jens-maus jens-maus added this to the future release milestone May 3, 2022
@jens-maus
Copy link
Owner

@Baxxy13 Kannst du mal bitte schauen ob das Problem hier inzwischen in den aktuellen nightly builds bereinigt wurde von eQ3?

@Baxxy13
Copy link
Contributor Author

Baxxy13 commented Jan 8, 2023

Da hat sich erstmal nichts geändert.
Aber es ist eher ein User-Problem und hat irgendwie mit dem Escaping zu tun.
Black hatte mir mal ein funktionierendes Beispiel mit dem SDV generiert:

!- PutParamset Zuweisung vom SDV V4.09.04F LCL für Gerät: HmIP-PSM
string stdErr=""; string stdOut="";
string TCL="";
TCL= TCL # " {COMBINED_PARAMETER {string {S=true,OT=30}}}"; !- DatenTyp Integer beachten, Aufzählung: 0=OFF 1=ON_DELAY 2=ON 3=OFF_DELAY

object oCHANNEL= dom.GetObject (ID_CHANNELS).Get ("HMIP-PSM 0D2 Kanal :3 - Schaltaktor");
object oIFace= dom.GetObject (oCHANNEL.Interface () );
string sTCL= ^puts [xmlrpc ^ #oIFace.InterfaceUrl()# ^/ putParamset [list string \"^#oCHANNEL.Address()#^\"] [list string \"VALUES\"] [list struct \"^#TCL#^\"]]^;
system.Exec ("/bin/sh -c 'echo \"load tclrpc.so; " # sTCL # "\" |tclsh'",&stdOut,&stdErr);

Es ist also möglich COMBINED_PARAMETER per xmlrpc.PutParamset zu übergeben.

string sTCL sieht dann so aus:
puts [xmlrpc xmlrpc://127.0.0.1:32010/ putParamset [list string \"0001D3C99CA0D2:3\"] [list string \"VALUES\"] [list struct \" {COMBINED_PARAMETER {string {S=true,OT=30}}}\"]]

Ich hab's aber bisher nicht geschafft das selbst so zu escapen das es mit dem obigen 2-Zeiler läuft.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
⚓ upstream issue This is a bug/issue for/in upstream software (OCCU, etc.) 🐛 bug-report Something isn't working 🏷️ HmIPServer This refs the HmIPServer component
Projects
None yet
Development

No branches or pull requests

4 participants