Hallo,
das Problem ist nicht das Einstellen des Codes, sondern Exportieren desselben. In den HTTP-Requests sind die Namen der Variablen und Scripte in einem internen Format abgelegt, so das ein einfaches Verteilen mittels Dateien schon problematisch werden kann.
Aber fangen wir mal an:
Zunächst läuft der "Flow" "Zuhause_AnAus" auf dem Handy. Leider gibt es da keinen Quellcode zu, nur den Flow oder ein Bild.
Zuhause_AnAus.png
Zum Abmelden läuft "Zuhause_Logoff" ("Abmeldung vom Netzwerk"). Damit wird die aktuelle Zeit in einer statischen Variablen gespeichert:
// holen aktuelles Datum und Uhrzeit
var jetzt = (new Date());
// umsetzen in laufenden Wert
var jetztzeit = jetzt.getTime();
// und merken (in Millisekunden seit dem 1.1.1970)
setVariable("Zuhause_Datum", jetztzeit);
Zum Anmelden - also beim Wiedereintritt in den umzäunten Bereich, läuft "Zuhause_Logon" ("Anmeldung am Netzwerk"). Dieser ist nur der Aufrufer für den eigentlichen Teil der Arbeit:
// aufruf des eigentlichen Scripts
triggerShortcut("Zuhause_Logon_Aktion");
In dem Script "Zuhause_Logon_Aktion" ("Anmeldung am Netzwerk: Geräte holen, in Schleife abarbeiten") wird der logische Teil der Arbeit durchgeführt:
var myIP, myTyp, myRelais, myAbsent, myOnOff, myDuration, myTimeframe;
// holen aktuelles Datum und Uhrzeit
var logon = (new Date());
// umwandeln in laufenden Wert
var logonzeit = logon.getTime();
// wann war nochmal der logoff?
var logoffzeit = getVariable("Zuhause_Datum");
// Differenz (in Millisekunden)
var diffzeit = logonzeit - logoffzeit;
// Differenz (in Minuten)
diffzeit = Math.floor(diffzeit / 1000);
// Struktur Datensatz: IP ; Dauer ; on_off ;
var WiFi_Geraete = getVariable("Zuhause_Geraete");
// aufteilen in 1...n Geräte
var Geraete_array = WiFi_Geraete.split('"');
// für jedes Gerät einzeln ausführen
for (var i = 0; i < Geraete_array.length; i++) {
var WiFi_Geraet = Geraete_array[i];
var EinGeraet = WiFi_Geraet.split(';');
// nun liegt ein Gerät im Array vor, Einzelwerte holen, ggf. default setzen
myIP = EinGeraet[0]; // geht nicht für IP
myTyp = EinGeraet[1] || "relay"; // Relais
myRelais = EinGeraet[2] || "0"; // mit # 0
myAbsent = EinGeraet[3] || "5"; // erst nach 5 Minuten Abwesenheit
myOnOff = EinGeraet[4] || "on"; // einschalten
myDuration = EinGeraet[5] || "420"; // für 7 Minuten
myTimeframe = EinGeraet[6]; // Das kommt später
// nächsten Schritt nur ausführen, wenn mehr Zeit vergangen ist als vorgegeben
if (diffzeit >= myAbsent) {
triggerShortcut("Zuhause_Logon_Aktion_Status", {
'SH_IP_URL': myIP,
'SH_IP_Typ': myTyp,
'SH_IP_Relais': myRelais,
'SH_OnOff': myOnOff,
'SH_Duration': myDuration,});
}
}
Alles anzeigen
Im folgenden Request "Zuhause_Logon_Aktion_Status" ("Anmeldung am Netzwerk: Gerät Status auslesen") wird der Status abgefragt.
Hier wird dann auch der 1. HTTP-Request auf einen Shelly abgesetzt:
http://{SH_IP_URL}/{SH_IP_Typ}/{SH_IP_Relais}/status
Nach der Ausführung wird der Response abgearbeitet. Auch der Kommentar am Anfang darf nicht weggelassen werden, da hier durch den Parser Variablen erkannt werden, die später noch Verwendung finden:
//http://{SH_IP_URL}/{SH_IP_Typ}/{SH_IP_Relais}/?turn={SH_OnOff}&timer={SH_Duration}
var status = JSON.parse(response.body).ison;
var myIP = getVariable("SH_IP_URL");
var myTyp = getVariable("SH_IP_Typ");
var myRelais = getVariable("SH_IP_Relais");
var myOnOff = getVariable("SH_OnOff");
var myDuration = getVariable("SH_Duration");
// nächster Schritt notwendig? Status und Anforderung "über Kreuz"
if (status == false && myOnOff == 'on' ||
status == true && myOnOff == 'off') {
triggerShortcut("Zuhause_Logon_Aktion_Exec", {
'SH_IP_URL': myIP,
'SH_IP_Typ': myTyp,
'SH_IP_Relais': myRelais,
'SH_OnOff': myOnOff,
'SH_Duration': myDuration, });
}
Alles anzeigen
Wenn im Response festgestellt wurde, das eine Aktion erfolgen muss, wird das im letzten HTTP-Request "Zuhause_Logon_Aktion_Exec" ("Anmeldung am Netzwerk: Gerät schalten mit Timer") ausgeführt:
http://{SH_IP_URL}/{SH_IP_Typ}/{SH_IP_Relais}/?turn={SH_OnOff}&timer={SH_Duration}
Im Bereich der HTTP-Request-App müssen diverse statische Variablen definiert werden. Zum Teil werden diese als Speicher verwendet, zum Teil als Parameterübergabe:
Der Inhalt der Variablen für die Parameterübergaben ist zweitrangig, da diese in den Scripten überschrieben werden
SH_IP_URL // IP des Shellys
SH_IP_Typ // Typ des Shellys ("relais")
SH_IP_Relais // Nummer des Relais (0)
SH_OnOff // Ein- oder Ausschalten ("on")
SH_Duration // Dauer des Einschaltens in Minuten (7)
Interessanter werden die Variablen, die als Speicher dienen.
Zuhause_Datum // Datum der letzten Abmeldung - Inhalt wird vom Script aktualisiert
Zuhause_73 // Definition eines Gerätes
// IP ; Typ ; Nummer ; Nachzeit ; on/off ; Dauer;
// 192.168.2.xx;relais;0;7;on;60
Zuhause_Geraete // Summe der Zuhause_xx
// {Zuhause_73}"{Zuhause_74}
Die Variable "Zuhause_Datum" ist der Speicher der letzten Abmeldung. Dagegen wird beim nächsten Wiedereintritt verglichen, ob etwas gestartet werden soll.
"Zuhause_73" ist vom Namen her unerheblich, sie dient nur der Speicherung der Parameter für einen Shelly, der beim Wiedereintritt beackert wird. Es kann davon (fast) beliebig viele geben.
"Zuhause_Geaete" ist die von den Scripten ausgewertete Variable, welche die Summe der einzelnen Geräte enthält. Hier werden die einzelnen Variablen eingefügt und durch ein Hochkomma (") getrennt.
HTH
Detlev