Der Code scheint so zu funktionieren...
==> Es sieht so aus als ob die Debug-Console nicht immer läuft
Vielleicht hilft der Code noch jemand anderem. Als nächster Punkt werde ich dem nachgehen, wie ich den Heizölstand auf dem Shelly-Gerät speichern kann. Bei der Arendst Firmware hatte ich ein Modul für die Firmware geschrieben aber ich möchte den Code nicht weiter unterhalten und suche nun nach einer Script Lösung.
==> Eventuell kann ich ja den ÖLSTAND als 2. Domain zwischenspeichern, damit ich die Daten bei einem Reboot nicht verliere...
==> Dann kann ich von dem Punkt aus berechnen wieviele Sekunden der Brenner lief, respektive diesen Wert von der Heizung abfrage und den ÖLSTAND berechnen. Bei meiner Arendst Lösung war ich damit so immer um die 10l genau über eine Heizungsperiode
Beiträge von lobocobra
-
-
Ich frage mich gerade ob dies nur die Debug Console betrifft.... der Code wurde scheinbar ausgeführt, obwohl ich im Debug nichts sehe... Mein Code lautet momentan:
Code
Alles anzeigenprint( "greeting, Eventhandler started"); let LastWatts = 0; // wir setzen am Anfang LastWatts auf 0 Shelly.addEventHandler( function (event, ud) { //let status = Shelly.getComponentStatus("switch", 1); let watts = status.apower; if (watts > 20) print(watts); //print(JSON.stringify(event)); if (event.component === "switch:1") { if (event.info.apower > 0) { print("Apower: " +event.info.apower + " " + "LastWatts: "+ LastWatts); } // we only switch the button on if it is the first time if (LastWatts < 300) { // there is a peek on start of the heating, we use that to prevent multiple starts if (event.info.apower > 300) { Shelly.call("Switch.Set", {id:0, on:"ein"==="ein"}); print("LastWattsNeu:" + LastWatts); } } // handler was called, lets save the curent WATTS as we want only activate the button if we were below 200 let status = Shelly.getComponentStatus("switch", 1); LastWatts = status.apower; } }, null );
-
Besten Dank, weiss noch sonst jemand, wieso der Handler zwischendurch aussetzt?
Hier sieht man es schön beim Debug Code.... rund 2 Minuten Lang gab es kein Update... danach lief es weiterCodeApower:72.4 LastWatts:77.6 23:07:14 Apower:76.2 LastWatts:72.4 23:07:23 Apower:72.4 LastWatts:76.2 23:07:24 ==> 2 Minuten Lang gab es keinen Interrrupt Apower:77 LastWatts:72.4 23:09:22 Apower:73 LastWatts:77 23:09:23 Apower:77.6 LastWatts:73 23:09:32
-
-
Ich glaube ich brauch hier nun ein wenig professionelle Hilfe, denn ich komme mit meiner Bastelei nicht weiter
Der Handler geht manchmal und manchmal nicht. Es ist so, dass er of 10 Minuten lang super läuft und danach gar nicht mehr.
=> Weiss jemand was das Problem ist? Das passiert bei meinem Code hier....Code
Alles anzeigenShelly.addEventHandler( function (event, ud) { if (event.component === "switch:1") { if (event.info.apower > 50) { print(event.info.apower); } // we only switch the button on if it is the first time if (LastWatts < 200) { if (event.info.apower > 200) { Shelly.call("Switch.Set", {id:0, on:"ein"==="ein"}); print(LastWatts); } } // handler was called, lets save the curent WATTS as we want only activate the button if we were below 200 LastWatts = event.info.apower; } }, null );
Aber auch dieser Code von HighFive, scheint das Gleiche Problem zu haben:
CodeShelly.addStatusHandler(function(statusData) { if (statusData.delta.apower != "undefined") { print(statusData.delta.apower) } });
Kann mir jemand helfen bitte? Das Problem ist, dass oft der Handler gar nicht aufgerufen wird... ich habe die neueste Firmware und einen neuen Shelly 2PM 3gen , der gut läuft.
=> wenn ich manuell folgenden Befehl in der Konsole eingebe, funktioneirt das ohne Probleme...
let status = Shelly.getComponentStatus("switch", 1); let watts = status.apower; if (watts > 20) print(watts); -
-
-
-
-
Jetzt sehe ich mal was da so rauskommt... aber es ist kein apower dabei
=> nur Schalteränderungen
=> Temperaturänderungen...
wie erfahre ich vom Eventhandler wenn WATT sich ändert?print( "greeting, Eventhandler started");
// Shelly.addEventHandler(eventHandler, null);Shelly.addEventHandler(
function (event, ud) {
// while we don't have better selectivity for event source
// if (typeof (event.info.state) !== 'undefined') {
if (typeof (event) !== 'undefined') {
print(event);
}
},
null
); -
Also dieser Eventhandler funktioniert schon mal, wenn ein Kanal gestoppt oder gestartet wird... hilft mir noch nicht viel aber immerhin ein Schritt weiter...
Shelly.addEventHandler(
function (event, ud) {
// while we don't have better selectivity for event source
if (typeof (event.info.state) !== 'undefined') {
print("TIMER WAS RESET");
}
},
null
); -
Kann mir bitte hier jemand helfen? Ich will einen Event registrieren, der bei jeder Apower Änderung den Code oben ausführt...
=> Danke
Es muss irgendwie so gehen...Shelly.addStatusHandler(function(e) { if (e.component === "switch:0") { if (e.delta.output === true) { MQTT.publish("stat/s_ug_heizung_brenner_temp/POWER", JSON.stringify(1), 0, false);} else if (e.delta.output === false) { MQTT.publish("stat/s_ug_heizung_brenner_temp/POWER", JSON.stringify(0), 0, false);} } });
-
Ein Key-Element habe ich mal... hier kann ich schauen ob Watt über 200 ist... wenn ja, dann wird der Kanal 1 gestartet:
Also hier wird noch gedruckt in die Konsole
let status = Shelly.getComponentStatus("switch", 1); let watts = status.apower; if (watts > 200) print(watts)
Und hier schalten wir den Kanal ein
let status = Shelly.getComponentStatus("switch", 1); let watts = status.apower; if (watts > 200) Shelly.call("Switch.Set", {id:0, on:"ein"==="ein"})
jetzt muss ich noch eine Funktion machen, die jegliche Änderung erfährt... ich will ja per sofort das machen, nicht nur alle 10 Sekunden -
-
-
Hallo zusammen Bei meinem Shelly 2 PM Gen3 überwacht
- Switch 2 den Stromverbrauch der Heizung
- Switch 1 kann den Brenner anschalten
Ich möchte nun, dass wenn die Heizung über 200Watt zieht (der Brenner läuft), der Swich 1 eingeschaltet wird für 15 Minuten. Die Einschaltzeit kann ich ja über den Timer steuern, aber ich habe Probleme ein Script zu schreiben, dass bei 200 Watt den 1. Switch einschaltet.
Wie man den Switch einschaltet habe ich rausgefunden, aber noch nicht, wie man apower ausliest, überprüft und dann den Befel auslöst.
=> Shelly.call("Switch.Set", {id:0, on:"ein"==="ein"});
Code
Alles anzeigenvar config= { powerLimit: 200, //Limit in Watt, power needs tp be > Limit for sending a Call powerTime: 10, //Time in seconds, how long the power needs to be over the powerLimit, before sending a call } var tHandle=0, called=false; //global Variables function DoCall(){ //Do Webhook try{ called= true; tHandle= 0; //Reset Timer Handle print("TEST : mumpfy mumpfy"); }catch(e){ErrorMsg(e,'DoCall()');} } function CheckPower(d){ let r= Efilter(d,{device:['switch:1'], filterKey:['apower','id','component']},1); //Filter event data if(debug) print(Str(r)); if(!r || !Str(r.apower)) { //Exit if usless data if(debug) print ('Useless Data') return; } if(r.apower >= config.powerLimit && !tHandle && !called){ //Check if over Powerlimit if(debug) print('Timer armed'); tHandle= Timer.set(1000*config.powerTime,false,function() {DoCall()}); } if(r.apower < config.powerLimit){ //Check if under Powerlimit if(debug) print('Timer cleared'); Timer.clear(tHandle); //Reset Timer tHandle= 0; called= false; //Reset Called Flag } if(debug) print('Debug: found Event ',r,' Timer active:',tHandle>0,' Called:',called === true); //Debug output } function Main(){ //Main Code Shelly.addEventHandler(CheckPower); //Add EventHandler with Asyn CallBack }
-
Found it... maybe it helps somebody:
Accepted commands are:
status_update - causes the status of the corresponding component to be published on its <topic_prefix>/status/cover:<id> topic.calibrate - starts calibration procedure.open[,number] - opens the cover, optional duration parameter.close[,number] - closes the cover, optional duration parameter.stop - stops previously initiated movement.pos,number - cover goes to position, required parameter.rel,number - cover goes to relative position, required parameter.
-
-
Hallo zusammen
Ich habe bisher shelly2.5 benutzt, jedoch fallen die nun einer nach dem anderen aus (wegen dem bekannten Kondensator- Problem). Die Steuerung über MQTT ging einwandfrei.
=> Ich habe sie nun durch Shelly2PM ersetzt, finde aber in der API Dokumentation beim besten Willen den Befehl nicht um die Storen zu:
- Öffnen
- Schliessen
- auf eine gewisse Prozentzahl zu stellen.
Früher lautete der Befehl...: shellies/y25_eg_garag_zip_0wzseite/roller/0/command (open/close/%)
Kann mir bitte jemand helfen? Als ehemaliger Linux Spezi ging ich eigentlich davon aus, dass ich das selber rausfinde, aber es kann doch nicht sein, dass ich für so rudimentäre Befehle etwas skripten muss?
Vielen Lieben Dank im Voraus -
Hier noch die erheblich bessere Variante zu obigem Skript.
Code
Alles anzeigenlet Topic = "dein/eigenes/topic"; let Trans = [ // zwecks Transformation in booleschen Wert {key:"ein", value:true}, {key:"aus", value:false} ]; let Out = 1; // Id des Ausgangs function action(topic, payload) { print(payload); let p = JSON.parse(payload); // liefert die payload Struktur als Objekt let i; for(i=0; i<Trans.length && Trans[i].key!==p.schalte; ++i); // suche nach gültigem key if(i===Trans.length) return; // p.schalte enthält ungültigen key let para = {id:Out, on:Trans[i].value}; if(p.dauer!==undefined) para.toggle_after = p.dauer; Shelly.call("Switch.Set", para); } MQTT.subscribe(Topic, action);
Sie ist besser, weil per Werte am Skriptanfang die gewünschten Dinge festgelegt und so leicht änderbar sind und weil man für eine Änderung jeweils nur an einer einzigen Stelle die Änderung vorzunehmen braucht.
Außerdem ist das die Vorstufe zu einer Konfiguration außerhalb des Skripts im KVS.
Man kann selbstverständlich die MQTT Payload komplexer gestalten, bspw. um die Ausgangs-Id erweitern.
{"out":1, "schalte":"ein", "dauer":300} täte den Ausgang 1 für 5 Minuten einschalten.
Hierfür müsste aber action() noch angepasst werden.
Hey Herzlichen Dank für die Hilfe!
Die Idee finde ich super, da ich somit den neuen Shelly anpassen kann, ohne das restliche Einvironment anzupassen!
=> Ich werde das mal so versuchen