wenn ich es aber richtig entziffere, dann steht da 15A/250VAC. Das deutet für mich auf einen Strompfad hin
Das hab ich nun auch gesehen. Wenn ich den Rest des Relais richtig entziffert habe, handelt es sich um ein K1CK012W-Relais. Allerdings scheint dies nicht mit den 15A/250VAC-Spezifikationen übereinzustimmen. Der K1CK012W ist ein Miniatur-Leistungsrelais, das über einen Wechslerkontakt verfügt. Das bedeutet, dass es nur einen Kontakt schalten kann. Auf der Platine befindet sich jedoch ein Bauteil, das wie ein Triac aussieht und möglicherweise den zweiten Kontakt schalten kann. Daher wäre es am einfachsten, zu messen, ob die Niveauüberwachung im ausgeschalteten Zustand überhaupt einen Kontakt durchlässt oder nicht.
Das kann ich ebenfalls nachvollziehen. Das Foto des nicht geöffneten WPS 5000 zeigt bereits einen Eingang und einen Ausgang. Im schlimmsten Fall sind die Anschlüsse nicht geschraubt, sondern verlötet, was einen noch größeren Aufwand bedeuten würde. Allerdings bezweifle ich das stark. Des Weiteren könnte es im Schaltkasten an Platz für einen Shelly fehlen, was sich jedoch mit einer Aufputz-Abzweigdose ausgleichen ließe. Da der WPS 5000 selbst nur eine IP20-Schutzklasse hat, muss man bei der Auswahl der Abzweigdose nicht auf besondere Schutzklassen achten, sofern der WPS gemäß den Herstellerangaben in einer trockenen Umgebung installiert wurde.
Aber du hast recht, das sind viele Spekulationen. Es wäre besser, auf das Foto vom Inneren des WPS 5000 zu warten.
Aber von dem schwarzen und grauen geht einer in den Schalter, der andere geht raus. Es gibt lediglich 3 Adern. Es geht kein anders Kabel davon ab
Die Frage ist einfach die: Hast du schonmal nachgeschaut, wohin das 3 Adrige Kabel des Schalters führt? Eventuell direkt zur Steckdose oder zu einer Abzweigdose? Wenn du keine Abzweigdose findest, dann öffne mal die Steckdose und schau mal ob sich darin ein nicht angeschlosses rotes Kabel befindet. Bitte daran denken, die Steckdose vorher stromlos zu machen und am besten nicht nur über den Schalter sondern direkt über die Sicherung!
Genau, also habe ich den Satz ursprünglich falsch interpretiert. Nicht einfach bedeutet nicht, dass es unmöglich ist, sondern lediglich, dass es eine Herausforderung darstellt. Es ist möglich, wenn man, wie ich bereits erwähnte, die Niveauüberwachung fest anschließt und den Anschluss des L am Ausgang überprüft.👍
Im Schaltkasten der Niveauüberwachung ist der Schaltzustand an den Klemmen nicht einfach abzugreifen, weil das interne Relais offenbar zweipolig schaltet.
Kurz gefragt, verstehe ich das falsch? Warum kann man da nicht den Shelly dazwischen klemmen? Empfehlenswert wäre doch nur die Niveauüberwachung fest anzuschließen, anstatt über den schukostecker. Oder übersehe ich einen wichtigen Punkt?
LEDs können über die Zeit ihre Helligkeit verlieren, was als **Degradation** bezeichnet wird. Dieser Prozess wird hauptsächlich durch die Betriebstemperatur beeinflusst, wobei höhere Temperaturen zu schnellerer Degradation führen können.
Wenn eine LED beginnt zu degradieren, kann dies zu einer Veränderung des elektrischen Verhaltens führen. Defekte in der LED oder im Vorschaltgerät können zu ungewöhnlichen Stromflüssen führen, die von einem Dimmer möglicherweise nicht richtig gehandhabt werden kann. Solche Defekte können auch dazu führen, dass die LEDs flackern oder nicht mehr richtig funktionieren. In manchen Fällen kann ein Defekt in der LED oder im Netzteil der Leuchte auch einen Fehlerstrom erzeugen, der vom Dimmer als problematisch erkannt wird und zu einem Neustart oder Abschalten führen kann.
Vielleicht sollte mal getestet werden (z.b: mit einem einzelnen dimmbaren Leuchtmittel >10 W) ob der Dimmer 2 ein ähnliches Verhalten aufweist. Dann hat wohl der Dimmer einen Defekt. Ansonsten wird es mit hoher Wahrscheinlichkeit an den LEDs liegen.
Das klingt ja schon mal optimistisch. Irgendwo muss es doch eine Verteilerdose geben, zu der das Kabel führt. Oder es führt direkt zur Steckdose, dann müsste das rote, nicht angeklemmte Kabel, doch dort zu finden sein. Und da müsste sich auch ein Neutralleiter Anschluss befinden. Alles andere sollte selbsterklärend sein 😜
That sounds plausible. In my defense🙈, I created it quickly and only tested it briefly. But you’re right, we should definitely use the threshold value. And I assume that info.event.id can also react in the output?
Hello, with pure HTML knowledge, it will be difficult to understand this code that you have posted. Even I have my difficulties with it and I am not completely inexperienced in programming. But if you delve a little more into this subject, you can at least write simple scripts for Shelly Script. If I interpret it correctly, you have a Shelly that masters the scripts and also has 2 switches. Is it possibly the Shelly 2PM?
The following script I created and tested with the 2PM. Here, Switch 1 remains permanently on and it is checked on Switch 1 whether the wattage is higher than 10 watts. If this is the case, then Switch 2 is switched on and as soon as the wattage is less than 10 watts, Switch 2 is switched off. It is relatively simple in structure and I have not tested how the script runs in a permanent state. But the comments in the script could help you understand the function of the script.
As for the issue with the power outage: you just have to activate the slider on the script overview page (Run on startup).
But please note, the use of the script is at your own risk!
Code
// Configuration
var powerLimit = 10; // Set your threshold here
// Initialization
Shelly.call("Switch.Set", {id: 0, on: true}); // Turn on Channel 1 at startup
// Event handler function
function handleEvent(event) {
// The 'event' argument contains the event data sent by the Shelly devices.
//print(JSON.stringify(event));
// Check if "Switch:0" exists in the event
if (event.info.id === 0)
{
var power = event.info.apower; // Get the power consumption
if(typeof power !== "undefined")
{
// Check if the power consumption is above the threshold
if (power > powerLimit)
{
// If the power consumption is above the threshold, turn on Channel 2
// This could be, for example, a fan that cools down the device connected to Channel 1
Shelly.call("Switch.Set", {id: 1, on: true}); //this Function turns on the Channel 2
}
else
{
// If the power consumption is below the threshold, turn off Channel 2
// This means the device connected to Channel 1 is not consuming much power, so the fan can be turned off
Shelly.call("Switch.Set", {id: 1, on: false}); //this Function turns off the Channel 2
}
}
}
}
// Register the event handler
// The 'handleEvent' function will be called automatically whenever an event occurs (e.g., when the state of a device changes or when new power data is available)
Shelly.addEventHandler(handleEvent);
Hallo an alle, ich habe schon in einem anderem Thread: Externe Motion Steuerung ingorieren, wenn Shelly 1PM manuell einschalten wurde mein Script vorgestellt. Da es allerdings noch einen kleinen Bug hatte, habe ich es jetzt ausgebessert und möchte es euch hiermit in diesem Thread präsentieren. Der Grund, warum ich es in einem Extra Thread poste ist einfach der, daß mein Script zum Teil nicht das macht, was der TE sowie ein weiterer Zukömmling benötigte und Eiche den beiden bereits geholfen hat.
Wozu dient das Script:
Also ich nutze einen Bewegungsmelder, der in meinem Flur (beim durchlaufen) das Licht einschalten soll und nach einer gewissen Zeit, nachdem keine Bewegung mehr erkannt wurde wird das Licht wieder ausgeschaltet. Dann habe ich noch einen Taster der bei einem Single_Push das Licht etwas länger laufen lassen soll und bei einem weiteren Single_Push das Licht ausschalten soll. Soweit so gut bis hier hin braucht man keinen Shelly, wenn man den Taster gegen einen Schalter austauschen würde. Aber vielleicht möchte man es, wie ich, etwas Komfortabler haben, dann könnt ihr weiterlesen Ich habe in meiner Lampe ein 10 Watt (Dimm-fähiges) LED Leuchtmittel eingeschraubt. Dieses ist manchmal Praktisch, wenn die Frau sich anzieht und am Spiegel schauen möchte ob es passt . Nachts allerdings ist es wirklich nervig, wenn man halb verschlafen durch den Flur läuft und man von einem Flutlicht angestrahlt wird. Deshalb habe ich mir den Shelly Dimmer2 angeschafft. Dieser regelt ja ganz Praktisch die Helligkeit eines dimm-fähigen Leuchtmittels . Aber da dieser ja nicht Scriptfähig ist braucht man wiederum ein Shelly gerät, das Scriptfähig ist. Hier nutze ich den Shelly I4. Aber Theoretisch sollte das Script mit jedem Shelly der Gen2 und vielleicht auch der Gen3 funktionieren. Irgendwie Schweife ich ab, also nochmal von vorn und diesmal in Stichpunkten: Wozu dient dieses Script:
Bewegungsmelder registriert Bewegung -> Licht geht gedimmt an Bewegungsmelder hat abgeschaltet, da keine Bewegung mehr registriert wurde -> Das Script erhält eine Meldung, und ein Timer für das ausschalten des Lichtes wird gestartet (Kurze Anmerkung: ich habe den Blind-Timer des Bewegungsmelders auf die niedrigste Stufe gedreht, da ich die Ausschaltzeit über das Script regeln möchte) Der Timer des Bewegungsmelders im Script ist abgelaufen -> Das Licht geht aus. Der Taster wurde 1 mal gedrückt ->, das Licht geht für eine Gewisse Zeit (Einstellung im Script vorhanden als TimerDauerlicht) an. Der Bewegungsmelder hat keinen Einfluss mehr auf das Licht ( Ähnlich wie beim Dauerlicht) Der Taster wurde noch einmal gedrückt (bevor der Timer (TimerDauerlicht) abgelaufen ist) -> das Licht geht aus und der Bewegungsmelder darf wieder arbeiten. Der Taster wurde 2x gedrückt -> das Licht geht für eine Gewisse Zeit (TimerDauerlicht) an allerdings mit einer 100 % Helligket. Auch hier hat der Bewegungsmelder keinen Einfluss mehr auf das Licht. Der Taster wurde noch einmal gedrückt (bevor der Timer (TimerDauerlicht) abgelaufen ist) -> das Licht geht aus und der Bewegungsmelder darf wieder arbeiten. Der Timer (TimerDauerlicht) läuft ab -> das Licht geht aus und der Bewegungsmelder darf wieder arbeiten.
Dazu gibt es noch einen Tag- und einen Nachtmodus, Die Zeiten kann man im Script ebenfalls einstellen. Und für jeden Modus kann man dementsprechend die Helligkeit des Lichtes einstellen.
Wie wird was angeschlossen:
Den Bewegungsmelder habe ich direkt am Dimmer angeschlossen. Das hat den Vorteil, dass man das Licht sofort einschalten lassen kann. Wenn man den Bewegungsmelder an einem anderen gerät anschließt oder den Motion nutzt, gibt eine leichte Verzögerung wegen der Latenzzeiten im Netzwerk. Aber auch das funktioniert mit diesem Script. Da ich den Dimmer2 habe, könnte ich auch den Taster am Dimmer anschließen. Allerdings ist der Taster bei mir am I4, auf dem das Script installiert ist, angeschlossen. Auch hier sind beide Varianten möglich. Auch der Shelly Button sollte für dieses Script kein Problem sein.
Was wird bei dem Gerät wo der Bewegungsmelder angeschlossen ist eingestellt:
(Ich gehe hier Hauptsächlich vom Dimmer2 aus! Andere Geräte können andere Bezeichnungen haben!)
Der Button Type des Shellys wird auf Detached - switch doesn't control dimmer output eingestellt.
<-- Dieser Eintrag ist nur nötig wenn der Bewegungsmelder direkt am Dimmer angeschlossen wird,
2: http://<IP of Shelly I4>/script/<Skript-ID>/myTrigger?button=BM&push=on
BUTTON 1 SWITCHED OFF URL:
1: http://<IP of Shelly I4>/script/<Skript-ID>/myTrigger?button=BM&push=off
Falls der Bewegungsmelder ein Shelly Motion ist, könnte folgendes zutreffen:
(Bitte beachtet, dass ich diese Information nicht mit absoluter Sicherheit bestätigen kann, da ich keinen Shelly Motion besitze. Die folgende Aussage basiert lediglich auf meiner Vermutung:)
MOTION DETECTED:
2: http://<IP of Shelly I4>/script/<Skript-ID>/myTrigger?button=BM&push=on
END OF MOTION DETECTED:
1: http://<IP of Shelly I4>/script/<Skript-ID>/myTrigger?button=BM&push=off
Was wird beim Gerät eingestellt an dem der Taster angeschlossen ist:
Ist der Taster am Gerät angeschlossen, auf dem das Script ausgeführt wird, dann muss nur bei den Input/Output settings der Type auf "Button" bzw. "Momentary - Set Shelly device to be "Momentary" switch..." eingestellt werden.
Ist der Taster an einem anderen Gerät angeschlossen oder beim Shelly Button dann muss noch zusätzlich bei:
BUTTON SHORT PRESSED URL oder BUTTON PUSH URL:
2: http://<IP of Shelly I4>/script/<Skript-ID>/myTrigger?button=extbutton&push=single_push
BUTTON LONG PRESSED URL oder BUTTON DOUBLE PUSH URL:
1: http://<IP of Shelly I4>/script/<Skript-ID>/myTrigger?button=extbutton&push=double_push
Insbesondere bei den GEN1-Geräten scheint es keine Option zu geben, eine Double Push URL einzurichten. In solchen Fällen muss man auf die Long Pressed URL und Methode zurückgreifen, um das Licht mit voller Leistung (100%) einzuschalten.
Darüber hinaus habe ich nicht Zugang zu allen Shelly-Geräten, um die spezifischen Bezeichnungen der einzelnen URL-Aktionen zu überprüfen. Die oben genannten Bezeichnungen stammen vom Shelly1 und Shelly 2PM. Es ist jedoch zu beachten, dass diese Bezeichnungen bei den verschiedenen Shelly-Modellen variieren können.
Das Script:
Code
let ShellyIP = '192.168.1.2'; //IP-Adresse des Shellys, an dem das Licht angeschlossen ist
let TimerDauerlicht = 10; // Zeit die das Dauerlicht maximal an sein darf
let TimerDauerwert = "m"; // Wert für TimerDauerlicht (s=Sekunden, m=Minuten)
let dimState = 35; // Prozent Dimmerhelligkeit
let SWINT = true; /* Wert für die funktion des internen Tasters
(Wichtig, falls ein Taster oder Schalter an diesem Gerät angeschlossen ist,
der nicht den Dimmer schalten soll, muss der Wert auf "false" stehen!)*/
let SWID = 0; //TasterID (Muss nur angepasst werden, wenn der Taster an diesem Gerät und nicht am SW1 angeschlossen ist)
let ZeitNacht = "21:30"; // Uhrzeit für den Nachtmodus
let ZeitTag = "06:00"; // Uhrzeit für den Tagmodus
let DimNacht = 40; // Helligkeit bei Nachtmodus
let DimTag = 45; // Helligkeit bei Tagmodus
let BMTimer = 50; // Zeitdauer für den Bewegungsmelder
let BMTimerWert = 's'; // Einheit für BMTimer (s=Sekunden, m=Minuten)
let debug = false; // wenn true dann sende Ausgaben für Debug-Infos
/***************************************************************
* *
* Ab dieser Position Bitte nichts mehr ändern! *
* *
****************************************************************/
// Funktion zum Umrechnen der Uhrzeit in Minuten seit Mitternacht
function timeToMinutes(time)
{
let parts = time.split(':');
let stunden = Number(parts[0]);
let minuten = Number(parts[1]);
return stunden * 60 + minuten;
}
let nachtZeit = timeToMinutes(ZeitNacht);
let tagZeit = timeToMinutes(ZeitTag);
//Funktion zur Einstellung der Helligkeit im Tag- bzw. Nachtmodus
function adjustBrightness() {
let jetzt = new Date();
let stunden = jetzt.getHours();
let minuten = jetzt.getMinutes();
// Konvertiere die aktuelle Uhrzeit in Minuten seit Mitternacht
let aktuelleZeit = stunden * 60 + minuten;
if (aktuelleZeit >= nachtZeit || aktuelleZeit < tagZeit) {
// Wenn es nach der Nachtzeit oder vor der Tagzeit ist, setze die Helligkeit auf DimNacht
//setLightBrightness(ip, DimNacht);
dimState = DimNacht;
dPrint("Nachtmodus ist aktiv, Helligkeit ist bei " + DimNacht + "%");
} else {
// Ansonsten setze die Helligkeit auf DimTag
//setLightBrightness(ip, DimTag);
dimState = DimTag;
dPrint("Tagmodus ist aktiv, Helligkeit ist bei " + DimTag + "%");
}
}
// Funktion zum Umrechnen der Zeit in Millisekunden
function calcTime(timer, value){
let msec;
if(value === "s") {
msec = timer*1000;
} else {
msec = timer*60*1000;
}
return msec;
}
let SWTimer; // Variable für den Taster-Timer
let BMTimer; // Variable für den Bewegungsmelder-Timer
let SWtimerAktiv = false; // Variable, um den Status des Taster-Timers zu speichern
let BMtimerAktiv = false; // Variable, um den Status des Bewegungsmelder-Timers zu speichern
let bmZeit = calcTime(BMTimer, BMTimerWert); // Zeitdauer Bewegungsmelder in Millisekunden
let TDL = calcTime(TimerDauerlicht, TimerDauerwert); // Zeitdauer Taster in Millisekunden
//Funktion zur Überprüfung des Lichtes, wenn der Taster gedrückt wurde (Wenn Aus, dann an und umgekehrt nur aus wenn über Taster angeschaltet wurde)
function handleButtonPress(ip,DoublePress) {
adjustBrightness(); //reguliert den Tag- und Nachtmodus
isLightOn(ip, function(isOn) {
if (SWtimerAktiv && DoublePress === false) {
// Wenn das Licht durch den Taster eingeschaltet wurde, schalte es aus und setze SWtimerAktiv auf false
Timer.clear(SWTimer); //löscht den Timer
setLightBrightness(ip, dimState); //ändert die Helligkeit auf dimState (Wichtig: vor allem wenn das licht bei 100% ist, damit der BM wieder im gedimmten Modus einschaltet)
setLightBrightness(ip, 0); //(schaltet das Licht aus)
SWtimerAktiv = false; //Damit wird der BM wieder freigegeben
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint('Taster wurde 1x gedrückt: Licht wurde zuvor über den Taster eingeschaltet und wird daher jetzt Ausgeschaltet');
} else {
// Wenn das Licht aus ist oder durch den Bewegungsmelder eingeschaltet wurde, schalte es ein, starte den Timer und setze SWtimerAktiv auf true
if (DoublePress===false)
{
setLightBrightness(ip, dimState); //schaltet das Licht im gedimmten Modus ein
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint('Taster wurde 1x gedrückt: Licht wurde zuvor über nicht den Taster eingeschaltet und wird daher jetzt eingeschaltet');
}
else
{
setLightBrightness(ip, 100); //schaltet das Licht auf voller Last ein
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint('Taster wurde 2x gedrückt: wird daher mit 100% Helligkeit eingeschaltet');
}
//Timer wird gestartet damit das Licht nicht ewig brennt, wenn vergessen wird, das Licht über den Taster auszuschalten
SWTimer = Timer.set(TDL, false, function()
{
setLightBrightness(ip, dimState); //ändert die Helligkeit auf dimState (Wichtig: vor allem wenn das licht bei 100% ist, damit der BM wieder im gedimmten Modus einschaltet)
setLightBrightness(ip, 0); //(schaltet das Licht aus)
SWtimerAktiv = false; //Damit wird der BM wieder freigegeben
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint('Dauerlicht hat das Zeitlimit von '+ TDL + 'ms erreicht und wird jetzt ausgeschaltet');
}, null);
SWtimerAktiv = true; // Setze die Variable auf true, wenn das Licht eingeschaltet wird. Damit wird der BM gesperrt.
}
});
}
// Funktion zum Drucken von Debugging-Nachrichten
function dPrint(text){
if(debug===true){
print(text)
}
}
//Funktion zum einschalten des Lichtes mit der gesetzten Helligkeit
function setLightBrightness(ip, brightness) {
// Überprüfe, ob die Helligkeit größer als 0 ist
if (brightness > 0) {
// Wenn ja, schalte das Licht mit der angegebenen Helligkeit ein
let url = 'http://' + ip + '/light/0?turn=on&brightness=' + brightness;
Shelly.call("http.get", {url: url}, function (rs, ec, em) { }, null);
} else {
// Wenn nicht, schalte das Licht aus
let url = 'http://' + ip + '/light/0?turn=off';
Shelly.call("http.get", {url: url}, function (rs, ec, em) { }, null);
}
}
//Funktion zur Überprufung, ob das Licht an- oder ausgeschaltet ist.
function isLightOn(ip, callback) {
let url = 'http://' + ip + '/settings/light/0';
Shelly.call("http.get", {url: url}, function (response, error_code, error_message, ud) {
let resBody = JSON.parse(response.body);
if (resBody && typeof resBody.ison !== 'undefined') {
callback(resBody.ison);
} else {
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint('Fehler beim Abrufen des Lichtstatus: ', error_code, error_message);
callback(false);
}
}, null);
}
//Funktion zur Abfrage der HTTP-Get Parameter des Bewegungsmelders
function myCallback(optionalArg)
{
if (optionalArg && optionalArg.query)
{
//dPrint(optionalArg);
let optArg= optionalArg.query;
let ArgArray= getQueryParams(optArg);
if (ArgArray.button === "BM" && ArgArray.push === "off")
{
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint("Blindtime des Bewegungsmelders ist abgelaufen. Prüfe den Tasterstatus, ob weitere Aktionen notwendig sind...");
isLightOn(ShellyIP, function(isOn)
{
//dPrint("Licht ist an!");
if (!SWtimerAktiv)
{
BMtimerAktiv = true;
// Wenn der Timer nicht aktiv ist, schalte das Licht ein und starte einen neuen Timer
BMTimer = Timer.set(bmZeit, false, function()
{ // Setze den Timer auf bmZeit
adjustBrightness(); //reguliert den Tag- und Nachtmodus
setLightBrightness(ShellyIP, dimState); //ändert die Helligkeit auf dimState
setLightBrightness(ShellyIP, 0); // schaltet das Licht aus
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint("Es wurde keine weitere Bewegung registriert, und die Blindtime des Scriptes ist abgelaufen.");
dPrint("Das Licht wurde ausgeschaltet.");
BMtimerAktiv = false;
}, null);
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint("Timer von "+ bmZeit +"ms wurde gestartet da Bewegungsmelder aus ist und keine Taste vorher gedrückt wurde");
}
else
{
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint("Licht wurde mit Taster aktiviert, der Bewegungsmelder darf nicht ausschalten!");
}
});
}
if (ArgArray.button === "BM" && ArgArray.push === "on")
{
dPrint("Bewegungsmelder wurde angeschaltet und Überprüfung, ob BMTimer aktiv ist, wird durchgeführt");
if (BMtimerAktiv)
{
Timer.clear(BMTimer);
BMtimerAktiv = false;
// Verwende die print Funktion, um eventuelle Fehler zu behandeln (debug muss auf true sein)
dPrint("BMTimer war aktiv und wurde gelöscht");
}
}
// Ausführung eines externen Tasters (wie z.B.: der Shelly Button1 oder ein Taster an einem anderen Shelly )
if (ArgArray.button === "extbutton" && ArgArray.push === "single_push")
{
handleButtonPress(ShellyIP, false);
}
if (ArgArray.button === "extbutton" && ArgArray.push === "double_push")
{
handleButtonPress(ShellyIP, true);
}
}
}
// Registrierung des Endpunkts (myTrigger) für HTTP-Anfragen und Aufruf der Funktion myCallback
// Das heißt sobald das Script über die URL http://localhost/script/1/myTrigger?param1=value1¶m2=value2¶m3=value3
// aufgerufen wird, werden die Parameter (param1=value1¶m2=value2¶m3=value3) als String an die Funktion myCallback übergeben und bearbeitet
HTTPServer.registerEndpoint(
"myTrigger",
myCallback,
"callback_arg"
);
// Funktion zum Parsen von Query-Parametern aus einer URL
// Beispiel: Aus "http://localhost/script/1/myTrigger?param1=value1¶m2=value2¶m3=value3"
// wird ein Objekt erstellt: {"param1": "value1","param2": "value2","param3": "value3"}
function getQueryParams(str)
{
let result = {}; // Ein leeres Objekt wird erstellt, um die Parameter und ihre Werte zu speichern
let params = str.split('&'); // Die Eingabezeichenkette wird an jedem '&' aufgeteilt, um ein Array von Parametern zu erstellen
// Beispiel: Aus "param1=value1¶m2=value2¶m3=value3" wird
// ["param1=value1", "param2=value2", "param3=value3"]
// in der folgenden Schleife werden die Paramerter mit Namen und deren Wert in das Objekt eingetragen
params.forEach(function(param)
{
let paramParts = param.split('='); // Der Parameter wird an '=' aufgeteilt, um den Namen und den Wert des Parameters zu extrahieren
result[paramParts[0]] = paramParts[1]; // Der Parametername wird als Schlüssel und der Parameterwert als Wert zum Ergebnisobjekt hinzugefügt
});
return result; // Das Ergebnisobjekt, das die Parameter und ihre Werte enthält, wird zurückgegeben
}
//Funktion zur Überprüfung diverser Aktionen des Shelly I4 (in diesem Falle die Überprüfung, wie der Taster gedrückt wurde und was in dem Falle getan werden soll)
Shelly.addEventHandler(
function (event, user_data)
{
if (typeof event.info.event !== 'undefined' && SWINT === true)
{
if (event.info.id === SWID && event.info.event === 'single_push')
{
handleButtonPress(ShellyIP,false);
}
else if (event.info.id === SWID && event.info.event === 'double_push')
{
handleButtonPress(ShellyIP,true);
}
}
}
);
Alles anzeigen
Ich kann mir vorstellen, dass es einige abschrecken wird, diesen langen Text zu lesen. Aber wenn jemand ein ähnliches Projekt haben möchte, kann er hoffentlich dadurch eine gute Unterstützung finden.
Ich denke, damit sollte alles nötige gesagt sein. Ich wünsche euch viel Spaß damit
Das hatte ich im Script vor dem Factory Reset auch so gehabt, nur gab es das Problem das sich das Script (zwar selten aber ist passiert) aufgehangen hat und dann nichts mehr funktionierte. Durch die Aufteilung der Scripte funktioniert nur eine Hälfte des Flures nicht mehr. Da ich in der Woche auf Montage bin ist es schwierig meiner Frau zu erklären, was sie machen soll 🙈 und über die Fernwartung kann ich dann auch nicht zu jeder Tageszeit reagieren. und deshalb finde ich die Aufteilung besser.
Da ich damals ein ähnliches Projekt aufbauen wollte bzw. auch aufgebaut hatte kann ich es nicht lassen, meine Erfahrungen zu diesem Thema zu posten .
Mein Projekt war ähnlich gebaut wie das von Tomsta, nur dass ich keinen Motion von Shelly benutzte, sondern einen, oder besser gesagt 2 Bewegungsmelder an einem 2PM direkt angeschlossen hatte.
Und das nicht in einem Bad sondern im einem 6m langen dunklen Flur. Deswegen auch zwei Bewegungsmelder. Da ich dieses Projekt schon mittlerweile ganz anders und etwas komplizierter aufgebaut habe, ärgert es mich, dass ich das damalige Script meines 2PM nicht mehr zur Verfügung habe. Sonst hätt ich es hier gern gepostet. Denn das Prinzip war genau das selbe, was Tomsta jetzt braucht. Auch ich habe den I4 benutzt um mittels Taster das Licht als Dauerlicht ein bzw. wieder auszuschalten. Aber da Eiche nun soweit das Problem gelöst hat, ist das ja auch nicht so wichtig. Jetzt wird sich sicher der ein oder andere fragen, warum klinkt er sich jetzt hier ein wenn er sowieso nichts dazu beitragen kann.
Ich möchte mal jetzt mein Upgrade vorstellen und erklären. Vielleicht kann der ein oder andere es ja auch benutzen.
Ich habe wie gesagt den langen Flur der immer noch mittels Bewegungsmelder beleuchtet wird. Damals mit dem 2 PM an-und ausgeschaltet und per Taster wurde der Bewegungsmelder de- bzw. aktiviert. Alles funktionierte Prima! Nur störte es mich, wenn ich Nachts halb verschlafen auf die Toilette musste und ich den Flur entlang lief, ich von 500 Watt Strahlern (nur gefühlt!!! Es waren nur 10 Watt LED´s) wachgeblendet wurde. Also musste das Licht irgendwie gedimmt werden. Die Lösung: 2x Shelly Dimmer2 bestellt und gedacht, damit kann ich mittels Shellyscript die Dimmer nach meinen Wünschen schon steuern. Aber, was damals ich nicht wusste, war die Tatsache, dass die Nummer 2 hinter den Namen Dimmer nichts mit der Gen zu tun hatte und der Dimmer2 kein Shellyscript hat. (Wer lesen kann ist im Vorteil )
Doch zum Glück hatte ich ja noch den i4 und konnte damit mein Projekt beenden. Durch den Dimmer wird das Skript natürlich auch Komplexer. Aber erstmal, wie habe ich was angeschlossen:
Anfangs habe ich sowohl die Bewegungsmelder als auch die Taster an den I4 angeschlossen (Bewegungsmelder Eingang = SW1, Taster Eingang = SW2, Bewegungsmelder Kinderzimmer = SW3 und Taster Kinderzimmer = SW4). Jedoch störte es mich, dass die Reaktionszeit zwischen Bewegungsmelder an und Licht an manchmal zu lange gedauert hat, sodass ich den Bewegungsmelder direkt an den SW1 Port des Dimmers angeschlossen habe.
Den Button Type des Dimmers habe ich auf Detached - switch doesn't control dimmer output eingestellt
2: http://<IP of Shelly I4>/script/<Skript-ID>/myTrigger?button=BM&push=on
BUTTON 1 SWITCHED OFF URL:
1: http://<IP of Shelly I4>/script/<Skript-ID>/myTrigger?button=BM&push=off
Für den 2. Dimmer habe ich dieselben Einstellungen und nutze nur eine andere Skript ID. D.h.: Ich nutze für jeden Dimmer ein extra Script.
Mehr braucht man am Dimmer nichts einzustellen und den Rest erledigt der I4.
Der I4 hat noch meine Tasterbelegung wie Ursprünglich: SW2 und SW4!
Die Inputs sind dann folgendermaßen konfiguriert:
Name
Enable
Input/Output settings
Invert
Factory reset
input(0)
deaktiviert
Button
deaktiviert
deaktiviert
input(1)
Taster Eingang
aktiviert
Button
deaktiviert
deaktiviert
input(2)
deaktiviert
Button
deaktiviert
deaktiviert
input(3)
Taster KiZi
aktiviert
Button
deaktiviert
deaktiviert
Erwähnenswert ist noch, dass ich den Factory Reset deaktiviert habe, da ich im Scriot auch die Doppelklick Funktion nutze und zu Ostern hat sich mein I4 aufgehangen, sodass mein Sohn als der Doppelklick nicht klappte, er gleich 3x hinterher gedrückt hat. Somit wurde der Factory Reset ausgelöst und alles war futsch. Natürlich hatte ich auch kein Backup und ich hatte das ganze Osterwochenende damit zu tun, alles neu zu schreiben. Das hat auch den Grund, warum ich mich jetzt wieder mehr mit der Shellyscript Geschichte beschäftige. Naja aus Fehlern lernt man, deshalb Factory Reset ist aus und ich habe jetzt auch ein Backup. Und nach diesem Post sogar doppelt .
So, nun zum Skript:
Code
let ShellyIP = '192.168.0.52'; //IP-Adresse des Shellys, an dem das Licht angeschlossen ist
let TimerDauerlicht = 5; // Zeit die das Dauerlicht maximal an sein darf
let TimerDauerwert = "m"; // Wert für TimerDauerlicht (s=Sekunden, m=Minuten)
let dimState = 35; // Prozent Dimmer
let SWID = 1; //TasterID
let ZeitNacht = "21:30"; // Uhrzeit für den Nachtmodus
let ZeitTag = "06:00"; // Uhrzeit für den Tagmodus
let DimNacht = 35; // Helligkeit bei Nachtmodus
let DimTag = 45; // Helligkeit bei Tagmodus
let BMTimer = 10; // Zeitdauer für den Bewegungsmelder
let BMTimerWert = 's'; // Einheit für BMTimer (s=Sekunden, m=Minuten)
let debug = false; // wenn true dann sende Ausgaben für Debug-Infos
// Funktion zum Umrechnen der Uhrzeit in Minuten seit Mitternacht
function timeToMinutes(time) {
let parts = time.split(':');
let stunden = Number(parts[0]);
let minuten = Number(parts[1]);
return stunden * 60 + minuten;
}
let nachtZeit = timeToMinutes(ZeitNacht);
let tagZeit = timeToMinutes(ZeitTag);
//Funktion zur Einstellung der Helligkeit im Tag- bzw. Nachtmodus
function adjustBrightness() {
let jetzt = new Date();
let stunden = jetzt.getHours();
let minuten = jetzt.getMinutes();
// Konvertiere die aktuelle Uhrzeit in Minuten seit Mitternacht
let aktuelleZeit = stunden * 60 + minuten;
if (aktuelleZeit >= nachtZeit || aktuelleZeit < tagZeit) {
// Wenn es nach der Nachtzeit oder vor der Tagzeit ist, setze die Helligkeit auf DimNacht
//setLightBrightness(ip, DimNacht);
dimState = DimNacht;
dPrint(DimNacht);
} else {
// Ansonsten setze die Helligkeit auf DimTag
//setLightBrightness(ip, DimTag);
dimState = DimTag;
dPrint(DimTag);
}
}
// Funktion zum Umrechnen der Zeit in Millisekunden
function calcTime(timer, value){
let msec;
if(value === "s") {
msec = timer*1000;
} else {
msec = timer*60*1000;
}
return msec;
}
let SWTimer; // Variable für den Taster-Timer
let BMTimer; // Variable für den Bewegungsmelder-Timer
let SWtimerAktiv = false; // Variable, um den Status des Taster-Timers zu speichern
let BMtimerAktiv = false; // Variable, um den Status des Bewegungsmelder-Timers zu speichern
let bmZeit = calcTime(BMTimer, BMTimerWert); // Zeitdauer Bewegungsmelder in Millisekunden
let TDL = calcTime(TimerDauerlicht, TimerDauerwert); // Zeitdauer Taster in Millisekunden
//Funktion zum Überprüfung des Lichtes, wenn der Taster gedrückt wurde (Wenn Aus, dann an und umgekehrt)
function handleButtonPress(ip,DoublePress) {
adjustBrightness();
isLightOn(ip, function(isOn) {
if (isOn && DoublePress===false) {
// Wenn das Licht an ist, schalte es aus und stoppe den Timer
Timer.clear(SWTimer);
setLightBrightness(ip, dimState);
setLightBrightness(ip, 0);
SWtimerAktiv = false;
} else {
// Wenn das Licht aus ist, schalte es ein und starte den Timer
if (DoublePress===false)
{
setLightBrightness(ip, dimState);
}
else
{
setLightBrightness(ip, 100);
}
SWTimer = Timer.set(TDL, false, function()
{
setLightBrightness(ip, dimState);
setLightBrightness(ip, 0);
}, null);
SWtimerAktiv = true;
}
});
}
// Funktion zum Drucken von Debugging-Nachrichten
function dPrint(text){
if(debug===true){
print(text)
}
}
//Funktion zum einschalten des Lichtes mit der gesetzten Helligkeit
function setLightBrightness(ip, brightness) {
// Überprüfe, ob die Helligkeit größer als 0 ist
if (brightness > 0) {
// Wenn ja, schalte das Licht ein und setzen Sie die Helligkeit
let url = 'http://' + ip + '/light/0?turn=on&brightness=' + brightness;
Shelly.call("http.get", {url: url}, function (rs, ec, em) { }, null);
} else {
// Wenn nicht, schalte das Licht aus
let url = 'http://' + ip + '/light/0?turn=off';
Shelly.call("http.get", {url: url}, function (rs, ec, em) { }, null);
}
}
//Funktion zur Überprufung, ob das Licht an- oder ausgeschaltet ist.
function isLightOn(ip, callback) {
let url = 'http://' + ip + '/settings/light/0';
Shelly.call("http.get", {url: url}, function (response, error_code, error_message, ud) {
let resBody = JSON.parse(response.body);
if (resBody && typeof resBody.ison !== 'undefined') {
callback(resBody.ison);
} else {
// Verwende die print Funktion, um den Fehler zu behandeln
dPrint('Fehler beim Abrufen des Lichtstatus: ', error_code, error_message);
callback(false);
}
}, null);
}
//Funktion zur Abfrage der HTTP-Get Parameter des Bewegungsmelders
function myCallback(optionalArg)
{
if (optionalArg && optionalArg.query)
{
dPrint(optionalArg);
let optArg= optionalArg.query;
let ArgArray= getQueryParams(optArg);
if (ArgArray.button === "BM" && ArgArray.push === "off")
{
dPrint("Bewegungsmelder wurde ausgeschaltet");
isLightOn(ShellyIP, function(isOn)
{
dPrint("Licht ist an!");
if (!SWtimerAktiv)
{
BMtimerAktiv = true;
// Wenn der Timer nicht aktiv ist, schalte das Licht ein und starte einen neuen Timer
//setLightBrightness(ip, 100); // Setze die Helligkeit auf 100%
BMTimer = Timer.set(bmZeit, false, function()
{ // Setze den Timer auf bmZeit
adjustBrightness();
setLightBrightness(ShellyIP, dimState);
setLightBrightness(ShellyIP, 0); // Schalte das Licht nach bmZeit aus
BMtimerAktiv = false;
}, null);
dPrint("Timer von "+ bmZeit +"ms wurde gestartet da Bewegungsmelder aus ist und keine Taste vorher gedrückt wurde");
}
else
{
dPrint("Licht wurde mit Taster aktiviert, der Bewegungsmelder darf nicht ausschalten!");
}
});
}
if (ArgArray.button === "BM" && ArgArray.push === "on")
{
dPrint("Bewegungsmelder wurde angeschaltet und Überprüfung ob BMTimer aktiv wird durchgeführt");
if (BMtimerAktiv)
{
Timer.clear(BMTimer);
BMtimerAktiv = false;
dPrint("BMTimer war aktiv und wurde gelöscht");
}
}
}
}
// Registrierung des Endpunkts (myTrigger) für HTTP-Anfragen und Aufruf der Funktion myCallback
// Das heißt sobald das Script über die URL http://<IP des Shellys in dem das Skript ist>/script/<Skript-ID>/myTrigger?param1=value1¶m2=value2¶m3=value3
// aufgerufen wird, werden die Parameter (param1=value1¶m2=value2¶m3=value3) als String an die Funktion myCallback übergeben und bearbeitet
HTTPServer.registerEndpoint(
"myTrigger",
myCallback,
"callback_arg"
);
// Funktion zum Parsen von Query-Parametern aus einer URL
// Beispiel: Aus "http://<IP des Shellys in dem das Skript ist>/script/<Skript-ID>/myTrigger?param1=value1¶m2=value2¶m3=value3"
// wird ein Objekt erstellt: {"param1": "value1","param2": "value2","param3": "value3"}
function getQueryParams(str)
{
let result = {}; // Ein leeres Objekt wird erstellt, um die Parameter und ihre Werte zu speichern
let params = str.split('&'); // Die Eingabezeichenkette wird an jedem '&' aufgeteilt, um ein Array von Parametern zu erstellen
// Beispiel: Aus "param1=value1¶m2=value2¶m3=value3" wird
// ["param1=value1", "param2=value2", "param3=value3"]
// in der folgenden Schleife werden die Paramerter mit Namen und deren Wert in das Objekt eingetragen
params.forEach(function(param)
{
let paramParts = param.split('='); // Der Parameter wird an '=' aufgeteilt, um den Namen und den Wert des Parameters zu extrahieren
result[paramParts[0]] = paramParts[1]; // Der Parametername wird als Schlüssel und der Parameterwert als Wert zum Ergebnisobjekt hinzugefügt
});
return result; // Das Ergebnisobjekt, das die Parameter und ihre Werte enthält, wird zurückgegeben
}
//Funktion zur Überprüfung diverser Aktionen des Shelly I4 (in diesem Falle die Überprüfung, wie der Taster gedrückt wurde und was in dem Falle getan werden soll)
Shelly.addEventHandler(
function (event, user_data)
{
if (typeof event.info.event !== 'undefined')
{
if (event.info.id === SWID && event.info.event === 'single_push')
{
handleButtonPress(ShellyIP,false); // Ersetzen Sie '192.168.0.46' durch die tatsächliche IP-Adresse Ihres Geräts
}
else if (event.info.id === SWID && event.info.event === 'double_push')
{
handleButtonPress(ShellyIP,true);
}
}
}
);
Alles anzeigen
So das ganze habe ich im Skript 1 und eine Kopie des Skriptes im Skript 2 gespeichert. Und dort nur die Variable: ShellyIP mit der IP des 2. Dimmers und SWID auf den Wert 3 geändert.
Was macht das Skript:
Also in erster Linie schaltet der Bewegungsmelder das Licht an. Sobald der Bewegungsmelder ausgeht, wird ein Timer gestartet und das Licht geht dann nach 10 sekunden aus.
Drücke ich den Taster (Hier sehe ich gerade einen Fehler in der neuen Programmierung) geht (wenn das Licht an ist) das Licht aus und wenn das Licht aus ist, geht es an und startet einen Timer von 5 min und schaltet es dann wieder aus. Hier sieht man, es ist kein echtes Dauerlicht mehr. Das liegt aber daran dass gerade durch die Gewöhnung an den Bewegungsmelder gerne vergessen wird, das Licht über den Taster auszuschalten und dadurch unnötig Strom verbraucht wird. Und die Zeit für das Dauerlicht kann man ja auch erhöhen.
Zu dem Fehler an der Programmierung: bei der Programmierung vor dem Factory Reset, wurde das Licht beim ersten Tastendruck (egal ob das Licht an oder aus ist) auf 5 min Dauerlicht gestellt. Nun muss ich das licht ausschalten und wieder einschalten um das Dauerlicht zu aktivieren. Das war und ist nicht Sinn und Zweck der Sache und werde es (vielleicht nächstes WE) beheben.
Mein Licht hat auch einen Tag und einen Nachtmodus: Von 6:00 Uhr - 21:30 Uhr ist das Licht bei einer Helligkeit von 45% und Nachts zwischen 21:30 Uhr -6:00 Uhr ist es bei 35%.
Und es gibt auch eine Doppelklick Funktion, die das Licht auf 100% dimmt und somit den Flur hell erleuchtet.
Noch zu erwähnen ist, ist das Dauerlicht an und man betätigt den Taster, wird das Licht wieder ausgeschaltet und der Bewegungsmelder Modus ist wieder Aktiv.
So jetzt bin ich erstmal fertig mit meinem Roman und ich entschuldige mich im voraus, wenn ich diesen Post in einem Separaten Thread hätte posten sollen.
It’s important to know where you save your script. If you save your script in the 1st slot, then your URL will be:
http://<IP of your Shelly>/script/1/myTrigger?SogliaTemp=60.5
Code
let SogliaTemp = 58.5; // Default value
function myCallback(optionalArg)
{
// Check if optionalArg and its property 'query' exist
if (optionalArg && optionalArg.query)
{
// Store the value of optionalArg.query in the variable optArg
let optArg = optionalArg.query;
// Call the function getQueryParams with optArg as an argument and store the result in ArgArray
let ArgArray = getQueryParams(optArg);
// Check if the parameter "SogliaTemp" exists in ArgArray
if (ArgArray.SogliaTemp)
{
// Update the value of SogliaTemp with the passed value
SogliaTemp = parseFloat(ArgArray.SogliaTemp);
}
}
}
// Registration of the endpoint for HTTP requests
HTTPServer.registerEndpoint(
"myTrigger",
myCallback,
"callback_arg"
);
// Function for parsing query parameters from a URL
// Example: From "http://localhost/script/1/myTrigger?param1=value1¶m2=value2¶m3=value3"
// an object is created: {"param1": "value1", "param2": "value2", "param3": "value3"}
function getQueryParams(str)
{
let result = {}; // An empty object is created to store the parameters and their values
let params = str.split('&'); // The input string is split at each '&' to create an array of parameters
// Example: From "param1=value1¶m2=value2¶m3=value3" becomes
// ["param1=value1", "param2=value2", "param3=value3"]
// In the following loop, parameters with names and their values are added to the object
params.forEach(function(param)
{
let paramParts = param.split('='); // The parameter is split at '=' to extract the name and value of the parameter
result[paramParts[0]] = paramParts[1]; // The parameter name is added as the key, and the parameter value as the value to the result object
});
return result; // The result object containing the parameters and their values is returned
}
function Loop(){
try{
var TempH2O = Shelly.getComponentStatus('Temperature', 100).tC; //Lettura temperatura da addon
if (TempH2O < SogliaTemp) {
Shelly.call("Switch.Set", {"id": 0, "on": true});
print("Output: ON");
} else {
Shelly.call("Switch.Set", {"id": 0, "on": false});
print("Output: OFF");
}
print("")
}catch(e){print(e);}
}
Timer.set(1000,true,Loop);
Ich bin ein Shelly Anfänger und versuch mich gerade in das Thema Shelly Script rein zu lesen, da mein Projekt ohne Script nicht funktionieren wird.
Und was ich dringend benötigte, war eine Anregung, wie ich im Script einen HTTP Request erhalten kann.
Da ich auch die Query-Parameter von der URL benötige, habe ich zu deinem Script einige Sachen hinzugefügt. Ich hoffe es hilft auch anderen Mitgliedern
Code
// 20220917, CH: got HTTPServer.registerEndpoint to run! :-)
// 20230507, DE: get Parameters from URL
//
// Verified on a Shelly Plus 2PM
// Firmware version: 0.14.1
// Firmware build ID: 20230308-091102/0.14.1-g22a4cb7
// Web build ID: 230302093842-767992a8-HEAD
//
// Trigger a method (function) in a script via browser by
// - registering a name (endpoint) in a script
// - requesting the endpoint and Parameters via web
//
// As of now I use this method to write debug outputs to the console when needed.
// I don't have my computer connected all the time so all debug output to the console is lost.
// This way I can see all data on demand.
//
// Trigger the callback method via http://SHELLY_IP/script/SCRIPT_ID/myTrigger?what=ever&you=Want
// replace
// - SHELLY_IP with the IP of your shelly
// - SCRIPT_ID with the ID of this script ->
// use http://SHELLY_IP/rpc/Shelly.GetConfig in your browser and search for your script name
// - If you change the name of the query parameter (in this Description what and you), then you must also change the object name from ArgArray ;)
//
// ** Don't forget to set the 'run on reboot' to enabled! **
// function triggered via web request
function myCallback(optionalArg){
let optArg= optionalArg.query;
let ArgArray= getQueryParams(optArg); //With the example from above, I would get ArgArray.what and ArgArray.you here.
print("Endpoint request received with optional argument: What=", ArgArray.what, "and you=", ArgArray.you);
//With the example from above, I would get: Endpoint request received with optional argument: What= ever and you= Want
// put here whatever you want to do
// - debug outputs
// - call other scripts
// - reboot
// - etc.
}
HTTPServer.registerEndpoint(
"myTrigger", // endpoint to be registered (and later called via browser)
myCallback, // method to be called when endpoint triggered via web
"callback_arg" // I don't get this to work but who cares?
// I have no idea what to pass to my own method on an external call... *gg*
);
function getQueryParams(str) {
let result = JSON.parse('{}');
let params = [];
let currentParam = "";
for (let i = 0; i < str.length; i++) {
if (str[i] === '&') {
params.push(currentParam);
currentParam = "";
} else {
currentParam += str[i];
}
}
params.push(currentParam);
for (let i = 0; i < params.length; i++) {
let separatorIndex = -1;
for (let j = 0; j < params[i].length; j++) {
if (params[i][j] === '=') {
separatorIndex = j;
break;
}
}
let name = "";
let value = "";
if (separatorIndex !== -1) {
name = params[i].slice(0, separatorIndex);
value = params[i].slice(separatorIndex + 1);
}
result[name] = value;
}
return result;
}
// This script runs for ever and does nothing but to wait for the webbrowser to come in.
// I get an 504 error in the browser but the script does what it is supposed to!
// ** Don't forget to set the 'run on reboot' to enabled! **