Shelly H&T auf CCU3 mit CCU-Jack 2.x asynchron konfigurieren

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

Moderator: Co-Administratoren

Antworten
PeterAC
Beiträge: 69
Registriert: 19.12.2014, 14:07
Hat sich bedankt: 3 Mal
Danksagung erhalten: 6 Mal

Shelly H&T auf CCU3 mit CCU-Jack 2.x asynchron konfigurieren

Beitrag von PeterAC » 17.11.2023, 17:35

Hallo,

2023-11-22 Update: Implementierung und Erweiterung von Tipp von User Henke (CCU3-eigenes curl, timeout), Fehlerbehandlung von curl

es gab bereits einen Tipp, wie man Shelly H&T Module in Homematic einbinden kann:

viewtopic.php?f=31&t=49956&hilit=shelly

Inzwischen besteht ab der CCU3/Raspberrymatic mit CCU-Jack 2.x auch eine einfache Möglichkeit, Shelly Module über MQTT als "Virtuelle Geräte" in der Geräteliste der CCU3 zu implementieren und wie gewöhnliche HmRF- oder HmIP-Geräte zu verwenden. Allerdings lassen sich die Shelly-Module nicht direkt aus Homematic heraus konfigurieren, sondern verwenden dazu einen eigenen Web-Server.
Bei den batteriebetriebenen Shelly-Modulen besteht dabei die Schwierigkeit, dass sie von der CCU nicht unmittelbar angesprochen werden können, z.B um Änderungen der Konfiguration vorzunehmen, wie z.B. bei einem Shelly H&T. Dazu müsste der Shelly H&T geöffnet und der interne Taster gedrückt werden. Danach startet das Modul sein WebUI für ca. 3 Minuten, was dann eine Konfiguration mit Browser ermöglicht. Leider ist in diesem Modus der Stromverbrauch sehr hoch (ca. 300 mA), was die geringe Kapazität der relativ teuren C123A-Batterie schon spürbar belastet.
Statt dessen kann dafür das folgende Skript benutzt werden. Es setzt voraus, dass in der CCU ein mit dem Shelly-Modul verknüpftes Gerät existiert, auf das ein Homematic-Programm getriggert werden kann (s. a. Link oben).
Das nachfolgende Skript kann nun unter folgenden Voraussetzung gleichzeitig für mehrere Shelly-Module benutzt werden:
  1. jedes Modul hat einen zugeordneten Datenpunkt (Gerätekanal), der regelmäßig durch das Shelly-Modul aktualisiert wird.
  2. zu jedem Shelly-Modul werden drei Systemvariablen, Typ Zeichenkette, angelegt mit der folgenden Namenskonvention
    • _v<Kanalname>_Address
    • _v<Kanalname>_Command
    • _v<Kanalname>_Result
In der ersten Variable wird die http-Adresse des Shelly-Moduls eingetragen (z.B. http://shellyht-43ABCD/). In die zweite kommt der zu übertragenden Befehl (z.B. settings/?humidity_threshold=5). Die dritte Variable bleibt leer und nimmt das Ergebnis auf. Die Programmdefinition sieht nun folgendermaßen aus:
Screenshot 2023-11-17 171157.jpg
Darin triggern zwei virtuelle Geräte, die zwei Shelly-Modulen zugeordnet sind, über ihren Temperaturkanal das Programm und damit ein HM-Skript. Das zugehörige Skript ist nun recht kurz:

Code: Alles auswählen

! 2023-11-22 _mShellySense ($this$): Ermittelt aus aufrufendem Trigger die http-Adresse des Shelly-Moduls, zu übermittelnden Befehl und Variable für das Ergebnis
! Falls die zugeordnete Variable für das Ergebnis leer und ein Kommando definiert ist, wird das Kommando übertragen und das Ergebnis in der Ergebnisvariable gespeichert.
! Die Übertragung wird nur einmal durchgeführt, da die Ergebnisvariable danach i.d.R. nicht leer ist. Für eine erneute Übertragung muss die Ergebnisvariable
! zunächst wieder geleert werden. Dadurch eignet sich die Konstruktion insbesondere zur asynchronen Einstellung der batteriebetriebenen Shelly-Module, ohne das 
! Shelly-WebUI aktivieren zu müssen.
! 2023-11-16 Erste Version
! 2023-11-22 Implementierung und Erweiterung von Tipp von User Henke (CCU3-eigenes curl, timeout), Fehlerbehandlung von curl

! Im Übrigen sei zur Syntax der zu übertragenden Kommandos auf die Shelly-Web-API verwiesen.
! Das Skript setzt CCU-Jack 2.x voraus und dass die Shelly-Geräte als virtuelle MQTT-Geräte in der CCU angemeldet sind, um einen Trigger zu erzeugen.

! Benutzte Systemvariablen (können auch dem triggernden Datenpunkt zugeordnet werden)
! string "_v<Kanal-Name>_Address"	http-Adresse des Shelly-Moduls (z.B. "http://shellyht-4ABCD")
! string "_v<Kanal-Name>_Command"	Befehl für das Shelly-Modul (z.B. "settings/?humidity_threshold=5")
! string "_v<Kanal-Name>_Result"	Variable zum Empfang des Ergebnisses vom Shelly-Modul (JSON-Format)

if (("$src$").Substr(0,1)=="$") { quit; } ! Abbruch bei manueller Auslösung

object o_src         = dom.GetObject("$src$"); ! Triggernder Datenpunkt
if (!o_src) {quit;} ! Abbruch, falls Objekt nicht geladen werden kann

! Ermittelt die http-Addresse des Shelly Moduls, Command und Ergebnisvariable
string sChannel_Name  = dom.GetObject(o_src.Channel()).ToString(); 			! Bestimmt den Kanal-Namen
string sDevAddress    = dom.GetObject("_v" # sChannel_Name # "_Address").Value();	! Ruft http-Addresse ab
string sCommand       = dom.GetObject("_v" # sChannel_Name # "_Command").Value();	! Ruft Befehl ab; 
object oResultVar     = dom.GetObject("_v" # sChannel_Name # "_Result");		! Lädt Systemvariable für Ergebnis

! Führt Kommando nur bei leerer SysVar und nicht-leerem Kommando aus
if ( (oResultVar.State() == "") && (sCommand != "")) {
  string lGetOut;
  integer curl_err = system.Exec("curl -m 3" # " " # sDevAddress # sCommand,&lGetOut);
  if (curl_err == 0) { oResultVar.State(lGetOut); }
}
Im Skript wird aus der Bezeichnung des Datenpunktes der Beginn der Variablennamen konstruiert. Wenn die die zugeordnete Befehlsvariable einen Befehl an das Shelly-Modul enthält und die Ergebnisvariable leer ist, wird der Befehl (z.B. eine Konfigurationsanweisung) übermittelt. Wenn ein Ergebnis empfangen wurde, findet sich dies in der zughörigen Ergebnisvariablen. Danach werden weitere Ausführungen unterbunden, so dass man in Ruhe das Ergebnis analysieren kann.
Damit kann man bequem Konfigurationen mit minimalem Energiebedarf anpassen und ohne das Shelly-Modul physisch erreichen zu müssen. Bei einem Shelly H&T kann es allerdings bis zu 12 h dauern, bis die Ausführung erfolgt.
Weitere Module können durch Hinzufügen weiterer Trigger (und der zugehörigen Variablen) ergänzt werden. Prinzipiell kann das Ganze so auch mit Systemvariablen als Trigger funktionieren, allerdings müsste dafür die Konstruktion der Variablennamen angepasst werden.

VG,
Peter

Antworten

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