-
Autor
Hallo,
als blutiger Anfänger frage ich mich welche Variante die üblichere ist bzw. ob das Polling des lokalen ComponentStatus gegenüber dem Warten auf den StatusEvent irgendeinen Nachteil hat? Die Skriptfunktion ist (getestet) bei beiden Varianten exakt gleich, sogar der StatusEvent kommt ca. alle 5 Sekunden. Gibts da irgendwelche good-practices?
Polling-Variante:
Code
// Globale Variablen
let polling_time = 5000 //Wie oft soll die Leistung aktualisiert werden?
let url_on = 'http://192.168.8.51/rpc/switch.set?id=100&on=true'
let url_off = 'http://192.168.8.51/rpc/switch.set?id=100&on=false'
let flag_static = false
// Funktion zum Ermitteln der aktuellen Gesamtleistung des lokalen PROEM3
function GetPwr()
{
let em3json = Shelly.getComponentStatus('em:0');
let pwr = JSON.stringify(em3json.total_act_power);
return pwr;
}
// Funktion zum Schalten der Meldeleuchte am EM50
function SendCmd(state)
{
if (state == true)
{
Shelly.call("HTTP.GET",{url: url_on}, null);
print('ML eingeschaltet: ' + url_on);
}
else if (state == false)
{
Shelly.call("HTTP.GET",{url: url_off}, null);
print('ML ausgeschaltet: ' + url_off);
}
}
// Hauptschleife
function main()
{
let pwr = GetPwr();
let flag = false
print('Prüfe Leistung: ' + Math.round(pwr))
if (pwr < 0)
{flag = true;}
else if (pwr > 0)
{flag = false;}
if (flag != flag_static)
{
flag_static = flag;
print('Leistung=' + Math.round(pwr) + ' Neuer Zustand: ' + flag);
SendCmd(flag);
}
}
// TIMER
Timer.set(polling_time, true, main);
Alles anzeigen
StatusEvent-Variante:
Code
// Globale Variablen
let url_on = 'http://192.168.8.51/rpc/switch.set?id=100&on=true'
let url_off = 'http://192.168.8.51/rpc/switch.set?id=100&on=false'
let flag_static = false
// Funktion zum Schalten der Meldeleuchte am EM50
function SendCmd(state)
{
if (state == true)
{
Shelly.call("HTTP.GET",{url: url_on}, null);
print('ML eingeschaltet: ' + url_on);
}
else if (state == false)
{
Shelly.call("HTTP.GET",{url: url_off}, null);
print('ML ausgeschaltet: ' + url_off);
}
}
// Hauptfunktion, wird aufgerufen wenn ein StatusEvent ausgelöst wird
function StatusEvent(event)
{
let pwr
let flag
if (event.name === "em")
{
pwr = event.delta.total_act_power;
print('Aktuelle Leistung: ' + Math.round(pwr))
if (pwr < 0)
{flag = true;}
else if (pwr > 0)
{flag = false;}
if (flag != flag_static)
{
flag_static = flag;
print('Leistung=' + Math.round(pwr) + ' Neuer Zustand: ' + flag);
SendCmd(flag);
}
}
}
// Registrierung des StatusHandlers
Shelly.addStatusHandler(StatusEvent);
Alles anzeigen