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.
Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.
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