CCU-Jack virtuelles Gerät mit dynamischen Payload möglich

Der CCU-Jack als REST- und MQTT-Schnittstelle für die CCU und virtuelle Geräte für das IoT

Moderator: Co-Administratoren

Antworten
Benutzeravatar
JeRi
Beiträge: 4
Registriert: 15.03.2018, 22:03
Wohnort: Norderstedt
Hat sich bedankt: 1 Mal

CCU-Jack virtuelles Gerät mit dynamischen Payload möglich

Beitrag von JeRi » 20.02.2024, 15:02

Ich habe gerade eine Installation für eine zigbee2mqtt laufen, die sich auch problemlos an den CCU-JACK MQTT Server verbindet. Ich möchte damit Wasserventile von PEARL (eigentlicher Hersteller ist wohl RTX TUYA) steuern. Ich kann die Ventile im MQTT-Explorer sehen.
Die Ventile haben mehrere Bewässerungstimer, die man per Payload setzen kann. Mal etwas detaillierter:
Unter dem Topic: zigbee2mqtt/Wasserventil_1 ist dann z.B. folgender Inhalt zu sehen:

Code: Alles auswählen

{
  "battery": 75,
  "cycle_timer_1": "",
  "cycle_timer_2": "",
  "cycle_timer_3": "",
  "cycle_timer_4": "",
  "device": {
    "applicationVersion": 72,
    "dateCode": "",
    "friendlyName": "Wasserventil_1",
    "hardwareVersion": 1,
    "ieeeAddr": "…",
    "manufacturerID": 4098,
    "manufacturerName": "_TZE200_2wg5qrjy",
    "model": "ZVG1",
    "networkAddress": …”,
    "powerSource": "Battery",
    "stackVersion": 0,
    "type": "EndDevice",
    "zclVersion": 3
  },
  "last_valve_open_duration": 0,
  "linkquality": 76,
  "normal_schedule_timer_1": "23:20 / 1 / SuMoTuWeSa / 1",
  "normal_schedule_timer_2": "11:17 / 1 / SuSa / 0",
  "normal_schedule_timer_3": "",
  "normal_schedule_timer_4": "",
  "state": "OFF",
  "timer": 4,
  "timer_state": "enabled",
  "timer_time_left": 10,
  "water_consumed": "0.00",
  "weather_delay": "24h"
Bermekung:
… Adressen habe ich rausgenommen.
}
Um z.B. den normal_schedule_timer_1 zu setzen ist das Topic:

Code: Alles auswählen

zigbee2mqtt/wasserventil_1/set
Mit einem Payload (z. Beispiel um 12:15 12 Minuten Wässern, jeweils Montag und Freitag, die letzte 1 heißt aktiver Timer)

Code: Alles auswählen

{"normal_schedule_timer_1":"12:15 / 12 / MoFr / 1"}
D.h. man kann nur ein set auf das Ganze JSON-Konstrukt absetzen, der Payload enthält dann den zu ändernden Teil ebenfalls im JSON Format.
Wenn ich das, z.B. in einem virtuellen Taster als Topic und Payload einstelle und die Taste (virtuell) drücke, funktioniert es auch. Allerdings möchte ich den Payload dynamisch ändern, ich möchte ja verschiedene Bewässerungen einstellen können und ggf. auch ändern und anpassen. Das würde den Zugriff auf den $MASTER set des virtuellen Gerätes benötigen, der offenbar nicht in der REST-API vorhanden/implementiert ist. Für die anderen BidCos HmIP und CUxD Geräte kann ich das Masterset sehen und ggf. ändern.

Mit dem XML-API sehe ich das Masterset und kann es auch ändern, das ist aus einem Skript aber nicht so einfach, oder?
Gibt es andere Lösungen, die ich ggf. auch in einem HM Skript nutzen kann?
Habe ich was falsch verstanden?
Alles ist schwer, bevor es leicht wird.

Benutzeravatar
Baxxy
Beiträge: 10847
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 610 Mal
Danksagung erhalten: 2229 Mal

Re: CCU-Jack virtuelles Gerät mit dynamischen Payload möglich

Beitrag von Baxxy » 20.02.2024, 15:45

JeRi hat geschrieben:
20.02.2024, 15:02
Mit dem XML-API sehe ich das Masterset und kann es auch ändern,
Zeig mal.
Ich habe bei virt. Jack-Devices noch nie ein MASTER-PARAMSET gesehen.

Soweit ich weiß steht die Konfiguration der Geräte einzig in der ccu-jack.cfg
Die könnte man natürlich ändern, aber eher nicht wenn der Jack läuft.

Mathias
Beiträge: 1796
Registriert: 03.11.2010, 10:25
System: CCU
Wohnort: Aachen
Hat sich bedankt: 58 Mal
Danksagung erhalten: 262 Mal
Kontaktdaten:

Re: CCU-Jack virtuelles Gerät mit dynamischen Payload möglich

Beitrag von Mathias » 20.02.2024, 16:25

Über die REST-API des CCU-Jacks können derzeit nicht die Master-ParamSets der eigenen virtuellen Geräte geändert werden. Dies ist aber in Planung.

Über XML-RPC ist dies möglich. So ändert auch die CCU die Geräteeinstellungen der Jack-Geräte.

Über HM-Skript müsste dies auch möglich sein. Das habe ich aber noch nicht getestet.

Zur XML-API kann ich nichts sagen.

Zum eigentlichen Problem:

Mit dem CCU-Jack können generell dynamische Payloads, die von einem Zahlenwert abhängig sind, generiert werden. So kann z.B. ein Dimm-Wert per MQTT an einen Dimmer übertragen werden. Dies könnte auch dazu verwendet werden, dynamisch einen Text zusammenzubauen.

Für den Anwendungsfall könne eine Umsetzung, wie folgt aussehen:

Code: Alles auswählen

Zahl: 121512151
      12 15   12   1  5   1     
Text: 12:15 / 12 / MoFr / 1
Der TEMPLATE-Parameter wird dann aber entsprechend aufwändig. Am besten mal versuchen per HM-Skript die PAYLOAD zu ändern und dann das Senden anzustoßen.

Benutzeravatar
Baxxy
Beiträge: 10847
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 610 Mal
Danksagung erhalten: 2229 Mal

Re: CCU-Jack virtuelles Gerät mit dynamischen Payload möglich

Beitrag von Baxxy » 20.02.2024, 18:26

Mathias hat geschrieben:
20.02.2024, 16:25
Über XML-RPC ist dies möglich. So ändert auch die CCU die Geräteeinstellungen der Jack-Geräte.
Mir fehlt da irgendwie der Ansatz.

Wo genau sollen die Parameter stecken?
Im Gerät oder auf dem jeweiligen Kanal?

Mit dem SDV inspiziert finde ich absolut nichts.

Benutzeravatar
JeRi
Beiträge: 4
Registriert: 15.03.2018, 22:03
Wohnort: Norderstedt
Hat sich bedankt: 1 Mal

Re: CCU-Jack virtuelles Gerät mit dynamischen Payload möglich

Beitrag von JeRi » 20.02.2024, 18:53

Mit dem XML-API

Code: Alles auswählen

http://homematic-ccu3/addons/xmlapi/mastervalue.cgi?sid=*gültige ID&device_id=70442
wobei 70442 der Kanal 1 eines virtuellen Gerätes vom CCU-JACK ist. sieht man

Code: Alles auswählen

<mastervalue>
<device name="HM-RC-12 JACK000004:1" ise_id="70442" device_type="KEY_TRANSCEIVER">
<mastervalue name="LONG_PAYLOAD" value="{"normal_schedule_timer_2" : "11:17 / 1 / MoSu / 0"}"/>
<mastervalue name="LONG_RETAIN" value="0"/>
<mastervalue name="LONG_TOPIC" value="zigbee2mqtt/Wasserventil_1/set"/>
<mastervalue name="SHORT_PAYLOAD" value="{"normal_schedule_timer_1" : "23:20 / 1 / MoThFrSaSu / 1"}"/>
<mastervalue name="SHORT_RETAIN" value="0"/>
<mastervalue name="SHORT_TOPIC" value="zigbee2mqtt/Wasserventil_1/set"/>
</device>
</mastervalue>
mit mastervaluechange.cgi sollte man da Einträge ändern können, habe probiert, geht.

Ich hatte auch schon daran gedacht, die Werte als Zahlen in Geräte einzulesen. Ich muss allerdings irgendwie daraus einen entsprechenden Payload machen, aus einem Skript an die Kanalparameter zu kommen habe ich bisher nicht hingekriegt. Methoden die vielversprechend aussehen, GetParam() usw. laufen irgendwie in einem anderen Namensraum, dahinter bin ich noch nicht gekommen.

Im Moment denke ich drüber nach es mit TCL zu probierne, leider muss ich das erst mal besser lernen.

Ach so:

Vielleicht noch mal zum besseren Verständnis.

in dem Ventil gibt keine set und get Befehle auf einzelne Positionen, also sowas wie Topic

Code: Alles auswählen

Topic: zigbee2mqtt/wasserventil_1/state/set, Payload: On 
statt dessen muss man immer einen Wert im JSON Format als set Befehl geben, z.B.

Code: Alles auswählen

Topic: zigbee2mqtt/wasserventil_1/set, Payload: {"state":"On"}
Der Payload ist dann einer aus dem gesamten Satz, den das Ventil liefert (siehe meinen ersten Post)
Alles ist schwer, bevor es leicht wird.

Benutzeravatar
Baxxy
Beiträge: 10847
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 610 Mal
Danksagung erhalten: 2229 Mal

Re: CCU-Jack virtuelles Gerät mit dynamischen Payload möglich

Beitrag von Baxxy » 20.02.2024, 19:44

Ahh, jetzt.

Mein XML-Api AddOn war wohl zu alt und brachte Fehler.
Die neue Version zeigt jetzt alles.
@Black muss ich auch mal fragen warum der SDV die MASTER-Paramsets nicht anzeigt.

Gut, putParamset ist jetzt nicht so schwer.
Herausfordernder sind da schon deine JSON-Strings die übergeben werden sollen.
Das bekomme ich nur mit dem "Superstring-Delimiter" hin. Ob der sich inzwischen auf ner CCU im Script speichern lässt kann ich nicht sagen.
Auch müssen deine double-quotes innerhalb des Strings escaped werden.

Zum testen:

Code: Alles auswählen

string input_obj_name  = "HM-RC-4 JACK000013:1";

string choose_method   = "PutParamset";   			!- "PutParamset" = Werte schreiben / "GetParamset" = Werte auslesen
string choose_paramset = "MASTER";        			!- "MASTER" -Paramset oder "VALUES" -Paramset
string param_name      = "LONG_PAYLOAD";      		!- zu lesender / schreibender Parametername

!- zu schreibender Parameterwert:
var set_param_value    = ^"{\"normal_schedule_timer_2\" : \"11:17 / 1 / MoSu / 0\"}"^;

object input_object = dom.GetObject (input_obj_name);
if ( input_object ) {
string obj_address =  dom.GetObject (input_object).Address();
string obj_type = dom.GetObject (input_object).TypeName();
integer obj_interface = dom.GetObject (input_object).Interface();
string obj_interface_name = interfaces.Get (obj_interface).Name();


WriteLine("PutParamset-AusgabeString: xmlrpc.PutParamset("#obj_interface#","#obj_address#","#choose_paramset#","#param_name#","#set_param_value#")");
xmlrpc.PutParamset(obj_interface,obj_address,choose_paramset,param_name,set_param_value);
}


Viel Erfolg!

Antworten

Zurück zu „CCU-Jack“