Adi dank Fernzugriff auf Dein Testsystem mit Shelly Pro1PM konnte ich das jetzt mal selber ausprobieren 😀
Es geht wie folgt:
1. Shelly Actions einrichten
Damit der Shelly seinen Zustand meldet, müssen dort zwei Actions auf dem Ausgang (nicht dem Eingang) eingerichtet werden:
Eine mit Execute when = Switched On
, und folgender Hit URL bei Then Do:
http://vdcadmin:password@ip.der.p44.box/api/json/scriptapi?shelly=relay0&state=1
Eine mit Execute when = Switched Off
, und folgender Hit URL bei Then Do:
http://vdcadmin:password@ip.der.p44.box/api/json/scriptapi?shelly=relay0&state=0
Der Unterschied ist nur der "state", einmal 0, einmal 1. password
und ip.der.p44.box
müssen natürlich entsprechend angepasst werden.
2. Mainscript in der P44 zum Empfang der Actions:
Mainscript-Editor der P44 aufrufen mit http://ip.der.p44.box/p44script.html
und eingeben bzw. ergänzen:
// http-Requests von Geräten empfangen
on(webrequest()) as request
{
log(6, "webrequest = %s", request)
try {
// Request verarbeiten, aufteilen auf die verschiedenen Geräte
// - DingZ?
if (isok(request.dingz)) {
// das ist ein Request von einem dingz
// - weiterleiten via dignz_signal_ip_ip_ip_ip
var s = ifok(globalvars()['dingz_signal_'+replace(request.peer,'.','_')], false)
if (isok(s)) s.send(request)
}
// - Shelly?
if (isok(request.shelly)) {
// das ist ein Request von einem shelly
// - weiterleiten via shelly_signal_ip_ip_ip_ip
var s = ifok(globalvars()['shelly_signal_'+replace(request.peer,'.','_')], false)
if (isok(s)) s.send(request)
}
// immer: beantworten
request.answer({ "status":"ok" })
}
catch as e {
log(4, "Fehler bei Request-Verarbeitung: %s", e)
// auch im Fehlerfall: Antwort, damit der Client nicht bis zum Timeout hängen bleibt
request.answer({ "status":"error" })
}
}
In diesem Beispiel ist sowohl ein Teil für Shellys als auch für DingZ (wie in den techdocs im Detail beschrieben) enthalten. Wer nur das eine oder nur das andere braucht, kann den anderen Block weglassen, er schadet aber auch nicht. Auf die gleiche Weise könnten auch weitere API-Endpunkte erstellt werden für andere Gerätschaften.
Dieser Code schickt Meldungen je nach Herkunfts-IP (request.peer
) via signal()
an das entsprechende scripted device.
3. Scripted Device
Init-Message:
{
'message':'init',
'modelname': 'Shelly Pro1PM'
'output':'basic',
'dimmable':false,
'colorclass':8,
}
Implementation:
// Konfiguration
// - IP des Shelly
var shellyip = "100.200.30.40"
// - Part (Teil) des Shellys (Eingang, Ausgang, Sensor etc.), in der Shelly Action URL das XXXX:
// http://user:pw@p44_ip/api/json/scriptapi?shelly=XXXX&value=Y
var shellypart = "relay0"
// Verarbeiten von Schaltbefehlen, die von der P44/dS/matter-Seite kommen
on (message()) as m {
// P44 meldet eine Änderung am Gerätestatus
if (m.message=="channel" && m.index==0) {
// Channel0 (Helligkeit bzw. Ein/Aus) hat geändert, wenn >0 -> Ein, sonst -> Aus
geturl(format('http://%s/relay/0?turn=%s', shellyip, if(m.value>0, 'on', 'off')))
}
}
// Verarbeiten von Events, die via URL-Aufruf vom Shelly kommen
var signame = 'shelly_signal_'+replace(shellyip,'.','_')
var sig
if (!isok(globalvars()[signame])) {
// Es gibt noch kein signal für diese IP -> neues Signal erstellen
globalvars()[signame] = signal()
}
// jetzt können wir das bestehende oder gerade neu erstellte signal nutzen
sig = globalvars()[signame]
on (sig) as s {
// Shelly meldet eine Änderung des Ausgangs
log(6, "s = %s", s)
if (s.shelly==shellypart) {
// dies ist is der Teil des Shellys an dem wir interessiert sind
// Ausgangsänderung weiterleiten an P44/dS/matter
var msg = {'message':'channel', 'index':0 }
msg.value = if(s.value>0, 100, 0)
message(msg)
}
}
// Nicht vergessen: Rückmeldung "Es ist ok dass das Script hier endet"
return true