So hab jetzt die neue Version getestet mit einem 1min Intervall und dürfte perfekt funktionieren.
Wie immer danke ich Dir recht herzlich für Deine Hilfe.
Lg Marius
Werde es noch weiter beobachten und dann den Timer auf 0 Uhr jeden Tag einstellen.
So hab jetzt die neue Version getestet mit einem 1min Intervall und dürfte perfekt funktionieren.
Wie immer danke ich Dir recht herzlich für Deine Hilfe.
Lg Marius
Werde es noch weiter beobachten und dann den Timer auf 0 Uhr jeden Tag einstellen.
Ich gebs gerne zu, bin gerade etwas überfordert
Bei Deiner besseren Ergänzung muss ich dann auch einen Job im Browser starten?
Ich verwende jetzt #2 und bekomme fogenden Fehler:
Uncaught Error: Function "cal" not found! 00:36:00
at Shelly.cal("script.stop", {id:1});
sorry war mein Fehler in #2 habe ich zum testen den timespec geändert.
Die KVS Daten nur auf null setzten klappt nicht, da sie im Skript gespeichert sind und alle 10Sek übergeben werden.
Du sollst den Schedule Job ja auch nicht in ein Skript packen!
Hab ich auch nicht, sondern per Broser Befehlszeile eingegeben
Warum sollen die beiden KVS Einträge entfernt werden? Es sollte genügen, sie zu überschreiben, bspw. mit den Werten 0.
Das ist reine Unwissenheit von mir, würde sicher überschreiben genügen.
Warum soll Skript 1 gestoppt werden?
Da die Daten Saldiert werden und wenn das Skript weiter läuft die KVS-Daten nicht zurückgesetzt werden
Hi eiche
Bist wie immer mein Retter Danke
Leider gibt es bei dem Schedule Job einen Fehler:
SyntaxError: JSON.parse: expected property name or '}' at line 1 column 203 of the JSON data
{"jobs":[{"id":1,"enable":true,"timespec":"0 * * * * *","calls":[{"method":"script.start","params":{"id":1}}]},{"id":2,"enable":true,"timespec":"0 0 0 * * *","calls":[{"method":"script.start","params":{id:2}}]}], "rev":65}
Ich habe es wieder löschen müssen, da ich auf dem 3Pro EM nicht mehr zugreifen konnte.
Nur zu Info: der 3Pro EM hat keine Web Ui, mit ihm kann man keine Schedule Job editieren.
Hi Community
Ich wollte aus 2 Scripts 1 machen und habe mir die Teile zusammen geklickt.
Das Script soll um 0 Uhr ein anderes Script mit ID: 1 stoppen, und die KVS Daten löschen.
Leider bekomme ich schon in der 1. Zeile einen Syntax Error:
Uncaught SyntaxError: Got ':' expected EOF 22:27:55
at "jobs": [
Da das andere Script mit einem Schedule-Job von eiche jede Minute überprüft wird, ob es noch läuft, braucht man es nicht extra wieder starten.
Könnte einer der Profi sich mal das anschauen?
{
"jobs": [
{
"id": 4,
"enable": true,
"timespec": "0 0 * * *",
"calls": [
{
"method": "script.stop",
"params": {
"id": 1
}
}
]
}
],
"rev": 30
}
var kvsAction= "delete";
try{
switch(kvsAction){
case "delete": Shelly.call("KVS.Delete",{key:"EnergyConsumed"}); //löschen
case "delete": Shelly.call("KVS.Delete",{key:"EnergyReturned"}); //löschen
break;
default:
print("_[ ",kvsAction," ]_ Is an invalid parameter! Only _[ 'save' / 'change' / 'delete' / 'load' / 'load_many' ]_ is valid!");
}
}catch(e){print(e);}
Alles anzeigen
Vielen Dank
Gruß Marius
Danke Euch eiche & User-64546 für Eure Hilfe, Problem gelöst.
Meine Frau muss sich an kurz / lang drücken erinnern, ich denke, diese manuelle Bedienung wird selten notwendig sein.
Wünsche Euch noch einen schönen Abend
Marius
eiche Danke, bin gerade am Suchen um die Einstellungen einzugeben
eiche JA so war es gedacht
User-64546 wollte es lieber auf den 2 pro Shellys da am 3em schon Dein Skript läuft.
Komme mit dem Schreiben nicht nach
Danke
Meine Frau wollte unbedingt einen Taster für den Pro3 & Pro2, damit Sie die Speicher manuell schalten kann.(zu wenig Einspeisung, Besuch schlaft da usw.)
Es sollte so funktionieren:
Frau drückt Taster / Timer läuft für 3 Stunden (Ausheizzeit) und schaltet sich nachher wieder aus.
Pro 3 werden alle 3 Phasen aktiviert
Pro2 hat nur eine Phase, wird ein/ aus geschaltet
so hab ich mir das gedacht
User-64546 JA genau so hab ich mir das gedacht, aber wenn das mit dem REFRECH funktioniert, ist das Sperren nicht mehr notwendig.
Marius
Danke @User-64546 werde ich ausprobieren.
Wofür ist dieser REFRECH?
Läuft das Skript dann normal weiter, ohne den Zusatz?
Marius
Hi
User-64546 hat das Skript hier im Forum zur Verfügung gestellt und ich benutzte es um 2 Warmwasserspeicher mit PV zu heizen. Link
Einen mit 400V wird jede Phase rauf und runter geschaltet und auf Stufe 4 wird der Obere 200V Einphasig ein & aus geschaltet.
Auch ohne die Timer wird alle 17 Min. das ganze Skript neu durchlaufen und somit wird jede manuelle Betätigung nicht möglich.
http://192.168.0.34/relay/2?turn=off
20:57:19
http://192.168.0.34/relay/1?turn=off
20:57:19
http://192.168.0.34/relay/0?turn=off
20:57:19
http://192.168.0.35/relay/0?turn=off
20:57:19
CounterSaldieren
20:57:29
21:13:59
CounterSaldieren
21:14:09
http://192.168.0.34/relay/2?turn=off
21:14:19
http://192.168.0.34/relay/1?turn=off
21:14:19
http://192.168.0.34/relay/0?turn=off
21:14:19
http://192.168.0.35/relay/0?turn=off
21:14:19
CounterSaldieren
21:14:29
CounterSaldieren
Alles anzeigen
Leider kann ich am Skript selber nicht viel ändern, da mir das Wissen fehlt.
Deshalb bin ich auf die Idee gekommen, mit Eurer Hilfe auf meinen Pro3 und Pro2 bei Tastendruck das "HTTP Get" zu unterdrücken und einen 3-Stunden-Timer für die Aufheizzeit in einem Skript laufen zu lassen.
Danke Marius
Hi Krauskopp
Wieso schalten die beiden ab. Woher stammt der Befehl?
Edit: Wozu schaltet man einen Speicher immer 3 Stunden ein?
Ich verwende dieses Skript auf einen Shelly 3em Pro und das schaltet nach manuellem Einschalten genau nach 17 Minuten beide Schelly Pro ab.
//let REMOTE = {
// ip: '192.168.0.34',
// relay1: '0', original
// relay2: '1',
// relay3: '2'
//}
let energieReturnWs = 0.0;
let energieKonsumWs = 0.0;
let CounterSaldieren = 0; // Timer skalieren
let CounterRelais = 0; // vielfaches von Timer 1
let CounterSave = 0; // save Timer Leistung
let CounterRefrech = 1;
let STUFE = 0; // Test orig 1
let Multiplikator = 1;
let STUFENWECHSEL = 0;
let Senden = 1;
let LAST = 1100; // Test orig 246
let AktPO = 0;
let Aktuell = 0;
let DivLastKonsom = 2;
let DivLastReturn = 3;
print('START');
Shelly.call(
"KVS.Get",
{
"key": "EnergyReturned",
},
function callback(result, error_code, error_message, userdata) {
if (error_code === 0) {
energieReturnWs = Number(result.value);
print("Loaded returned energy: ", energieReturnWs / 3600000, " kWh");
}
}
);
Shelly.call(
"KVS.Get",
{
"key": "EnergyConsumed",
},
function callback(result, error_code, error_message, userdata) {
if (error_code === 0) {
energieKonsumWs = Number(result.value);
print("Loaded consumed energy: ", energieKonsumWs / 3600000, " kWh");
}
}
);
function timerHandler(user_data) {
let em = Shelly.getComponentStatus("em", 0);
//print (em)
if (typeof em.total_act_power !== 'undefined') {
let power = em.total_act_power;
//print (power)
if (power >= 0) {
energieKonsumWs = energieKonsumWs + power * 0.5;
}
else {
energieReturnWs = energieReturnWs - power * 0.5;
}
CounterSave = CounterSave + 1;
CounterSaldieren = CounterSaldieren + 1;
CounterRefrech = CounterRefrech + 1;
//print("REAL");
//print("AKTPO =", AktPO);
//print("CounterRelais =", CounterRelais);
//print("CounterSaldieren =", CounterSaldieren);
AktPO = (AktPO + power);
//print("POWER;AKTUELL-MITTEL;SUMME-POWER", power,";",(AktPO / (CounterSaldieren + 1)),";",AktPO);
if (CounterSaldieren == 1)
{ // Bereitstelung der Stufe
Multiplikator = (Multiplikator * -1);
Shelly.call("Sys.SetConfig", {config: {location: {lon: STUFE * Multiplikator }}});
}
if (CounterSaldieren == 2)
{ // Anzeige NAME
Shelly.call("Sys.SetConfig", {config: {device: {name: Aktuell.toFixed(0)+"W ("+STUFE+") : " + Shelly.getComponentStatus("sys").time + " : +"+(energieKonsumWs / 3600000).toFixed(1)+" kWh -"+(energieReturnWs / 3600000).toFixed(2)+" kWh" }}});
}
if (CounterSaldieren > 19)
{
print("CounterSaldieren");
CounterRelais = CounterRelais + 1;
Aktuell = (AktPO / (CounterSaldieren + 1));
AktPO = Aktuell;
CounterSaldieren = 0;
//print("POWER =", Aktuell);
//print("STUFE =", STUFE);
//print("LAST =", LAST);
if (CounterRelais > 1) {
//print("CounterRelais");
//print("AKTUELL =", Aktuell);
//print("CounterRelais =", CounterRelais);
CounterRelais = 0;
if (Aktuell < ((LAST + LAST - (LAST / DivLastReturn)) * -1)) {
//Accu Lader viel mehr -500W
STUFE = STUFE + 2;
//print("STUFE + 2 ", STUFE, (LAST * 2) );
}
else if (Aktuell < ((LAST - (LAST / DivLastReturn)) * -1)) {
//Accu Lader mehr -225W
STUFE = STUFE + 1;
//print("STUFE + 1 ", STUFE, LAST );
}
else if (Aktuell > (LAST + (LAST / DivLastKonsom))) {
//Accu Lader viel weniger +300W
STUFE = STUFE - 2;
//print("STUFE - 2 ", STUFE,(LAST + (LAST / 5)) );
}
else if (Aktuell > (LAST / DivLastKonsom)) {
//Accu Lader weniger +50W
STUFE = STUFE - 1;
//print("STUFE - 1 ", STUFE,(LAST / 5) );
}
if (STUFE > 4) {
STUFE = 4;
}
else if (STUFE < 0) {
STUFE = 0;
}
if (STUFENWECHSEL < STUFE) {
Senden = 1;
AktPO = Aktuell + LAST;
}
else if (STUFENWECHSEL > STUFE) {
Senden = -1;
AktPO = Aktuell - LAST;
}
//print("wird gesendet: ",Senden);
if (Senden != 0) {
CounterRefrech = 1
if (STUFE > 0) {
http ('192.168.0.34/relay/2?turn=on&timer=2000'); //Shelly Pro3
//RelaisON(REMOTE.ip, REMOTE.relay1, 'on', '2000');
}
if (STUFE < 1) {
http ('192.168.0.34/relay/2?turn=off');
//RelaisOFF(REMOTE.ip, REMOTE.relay1, 'off');
}
if (STUFE > 1) {
http ('192.168.0.34/relay/1?turn=on&timer=1500'); //Shelly Pro3
//RelaisON(REMOTE.ip, REMOTE.relay2, 'on', '1500');
}
if (STUFE < 2) {
http ('192.168.0.34/relay/1?turn=off');
//RelaisOFF(REMOTE.ip, REMOTE.relay2, 'off');
}
if (STUFE > 2) {
http ('192.168.0.34/relay/0?turn=on&timer=1000'); //Shelly Pro3
//RelaisON(REMOTE.ip, REMOTE.relay3, 'on', '1000');
}
if (STUFE < 3) {
http ('192.168.0.34/relay/0?turn=off');
//RelaisOFF(REMOTE.ip, REMOTE.relay3, 'off');
}
if (STUFE > 3) {
http ('192.168.0.35/relay/0?turn=on&timer=1000'); //Shelly Pro2
//Shelly.call("Switch.set", {'id': 100, 'on': true, toggle_after: 1000}); //direct Original
//print("Local/relay/100/on/time=1000");
}
if (STUFE < 4) {
http ('192.168.0.35/relay/0?turn=off'); //Shelly Pro2
//Shelly.call("Switch.set", {'id': 100, 'on': false}); //direct Original
//print("Local/relay/100/off");
}
Senden = 0;
STUFENWECHSEL = STUFE;
}
}
//Shelly.call(
//"Sys.SetConfig", {
//config: {device:{name: Aktuell.toFixed(0)+"W ("+STUFE+") : " + Shelly.getComponentStatus("sys").time + " : +"+(energieKonsumWs / 3600000).toFixed(1)+" kWh -"+(energieReturnWs / 3600000).toFixed(2)+" kWh"}},
//},
//function(result, error_code, error_message, userdata) {
//print("error ", error_code, " : ", error_message);
//print("result", JSON.stringify(result));
//}
//);
CounterRefrech
if (CounterRefrech > 1990)
{
//print("CounterRefrech");
CounterRefrech = 1;
Senden = 1;
}
if (CounterSave > 3599)
{
//print("CounterSave");
CounterSave = 0;
SaveCounters();
}
}
}
}
function SetKVS(key, value) {
Shelly.call(
"KVS.Set", {
"key": key,
"value": value,
},
function(result) {
//print("KVS Saved, rev:", result.rev);
}
);
}
function http (url) {
print('http://' + url );
Shelly.call(
"http.request",
{ method: "GET" , timeout: "5" , url: 'http://' + url },
function (response, error_code, error_message, ud) {
//print(JSON.stringify(response));
//print(JSON.stringify(error_code));
//print(JSON.stringify(error_message));
//print(JSON.stringify(ud));
},
null
);
}
function SaveCounters() {
SetKVS("EnergyConsumed", energieKonsumWs );
SetKVS("EnergyReturned", energieReturnWs );
}
function start() {
Timer.set(500, true, timerHandler, null);
}
Timer.set(1000,false,start);
//Timer.set(500, true, timerHandler, null); // Original
Alles anzeigen
Wenn die Leistung der PV nicht mehr reicht oder zu wenig Warmwasser da ist,
Die 3 Stunden ist die Aufheizzeit vom Speicher.
Marius
Hallo Community
Ich würde gerne einen Pro 3 und einen Pro 2 jeweils mit einem Skript für „http Get Befehle“ für 3 Stunden sperren.
Hintergrund ist der, dass ich bei jedem Shelly einen Taster habe, der die Warmwasserspeicher für 3 Stunden manuell einschalten sollte.
Wollte meine Frau unbedingt!
Das Skript auf dem 3em Pro aber die 2 Shellys immer nach ein paar Minuten mit einem Off Befehl ausschaltet, das würde ich gerne verhindern.
Hoffe, Ihr könnt mir helfen
Marius
Hi HCHSA
Habe das Script ausprobiert, bekomme leider eine Fehlermeldung in Zeile 29 und bricht ab.
Uncaught ReferenceError: "async" is not defined
at async function controlHeater() {
^
Hallo HCHSA
Es gibt ein Script von User-64546 für 3 stufiges laden, vielleicht kann das Dir helfen.
let REMOTE = {
ip: '192.168.1.157',
relay1: '0',
relay2: '1',
relay3: '2'
}
let energieReturnWs = 0.0;
let energieKonsumWs = 0.0;
let CounterSaldieren = 0; // Timer skalieren
let CounterRelais = 0; // vielfaches von Timer 1
let CounterSave = 0; // save Timer Leistung
let CounterRefrech = 1
let STUFE = 1;
let Multiplikator = 1;
let STUFENWECHSEL = 0;
let Senden = 1;
let LAST = 246;
let AktPO = 0;
let Aktuell = 0;
let DivLastKonsom = 2;
let DivLastReturn = 3;
print('START');
Shelly.call(
"KVS.Get",
{
"key": "EnergyReturned",
},
function callback(result, error_code, error_message, userdata) {
if (error_code === 0) {
energieReturnWs = Number(result.value);
print("Loaded returned energy: ", energieReturnWs / 3600000, " kWh");
}
}
);
Shelly.call(
"KVS.Get",
{
"key": "EnergyConsumed",
},
function callback(result, error_code, error_message, userdata) {
if (error_code === 0) {
energieKonsumWs = Number(result.value);
print("Loaded consumed energy: ", energieKonsumWs / 3600000, " kWh");
}
}
);
function timerHandler(user_data) {
let em = Shelly.getComponentStatus("em", 0);
//print (em)
if (typeof em.total_act_power !== 'undefined') {
let power = em.total_act_power;
//print (power)
if (power >= 0) {
energieKonsumWs = energieKonsumWs + power * 0.5;
}
else {
energieReturnWs = energieReturnWs - power * 0.5;
}
CounterSave = CounterSave + 1;
CounterSaldieren = CounterSaldieren + 1;
CounterRefrech = CounterRefrech + 1;
//print("REAL");
//print("AKTPO =", AktPO);
//print("CounterRelais =", CounterRelais);
//print("CounterSaldieren =", CounterSaldieren);
AktPO = (AktPO + power);
//print("POWER;AKTUELL-MITTEL;SUMME-POWER", power,";",(AktPO / (CounterSaldieren + 1)),";",AktPO);
if (CounterSaldieren == 1)
{ // Bereitstelung der Stufe
Multiplikator = (Multiplikator * -1);
Shelly.call("Sys.SetConfig", {config: {location: {lon: STUFE * Multiplikator }}});
}
if (CounterSaldieren == 2)
{ // Anzeige NAME
Shelly.call("Sys.SetConfig", {config: {device: {name: Aktuell.toFixed(0)+"W ("+STUFE+") : " + Shelly.getComponentStatus("sys").time + " : +"+(energieKonsumWs / 3600000).toFixed(1)+" kWh -"+(energieReturnWs / 3600000).toFixed(2)+" kWh" }}});
}
if (CounterSaldieren > 19)
{
print("CounterSaldieren");
CounterRelais = CounterRelais + 1;
Aktuell = (AktPO / (CounterSaldieren + 1));
AktPO = Aktuell;
CounterSaldieren = 0;
//print("POWER =", Aktuell);
//print("STUFE =", STUFE);
//print("LAST =", LAST);
if (CounterRelais > 1) {
//print("CounterRelais");
//print("AKTUELL =", Aktuell);
//print("CounterRelais =", CounterRelais);
CounterRelais = 0;
if (Aktuell < ((LAST + LAST - (LAST / DivLastReturn)) * -1)) {
//Accu Lader viel mehr -500W
STUFE = STUFE + 2;
//print("STUFE + 2 ", STUFE, (LAST * 2) );
}
else if (Aktuell < ((LAST - (LAST / DivLastReturn)) * -1)) {
//Accu Lader mehr -225W
STUFE = STUFE + 1;
//print("STUFE + 1 ", STUFE, LAST );
}
else if (Aktuell > (LAST + (LAST / DivLastKonsom))) {
//Accu Lader viel weniger +300W
STUFE = STUFE - 2;
//print("STUFE - 2 ", STUFE,(LAST + (LAST / 5)) );
}
else if (Aktuell > (LAST / DivLastKonsom)) {
//Accu Lader weniger +50W
STUFE = STUFE - 1;
//print("STUFE - 1 ", STUFE,(LAST / 5) );
}
if (STUFE > 4) {
STUFE = 4;
}
else if (STUFE < 0) {
STUFE = 0;
}
if (STUFENWECHSEL < STUFE) {
Senden = 1;
AktPO = Aktuell + LAST;
}
else if (STUFENWECHSEL > STUFE) {
Senden = -1;
AktPO = Aktuell - LAST;
}
//print("wird gesendet: ",Senden);
if (Senden != 0) {
CounterRefrech = 1
if (STUFE > 0) {
//http ('192.168.1.157/relay/0?turn=on&timer=2000');
//RelaisON(REMOTE.ip, REMOTE.relay1, 'on', '2000');
}
if (STUFE < 1) {
//http ('192.168.1.157/relay/0?turn=off');
//RelaisOFF(REMOTE.ip, REMOTE.relay1, 'off');
}
if (STUFE > 1) {
//http ('192.168.1.157/relay/1?turn=on&timer=1500');
//RelaisON(REMOTE.ip, REMOTE.relay2, 'on', '1500');
}
if (STUFE < 2) {
//http ('192.168.1.157/relay/1?turn=off');
//RelaisOFF(REMOTE.ip, REMOTE.relay2, 'off');
}
if (STUFE > 2) {
//http ('192.168.1.157/relay/2?turn=on&timer=1000');
//RelaisON(REMOTE.ip, REMOTE.relay3, 'on', '1000');
}
if (STUFE < 3) {
//http ('192.168.1.157/relay/2?turn=off');
//RelaisOFF(REMOTE.ip, REMOTE.relay3, 'off');
}
if (STUFE > 3) {
Shelly.call("Switch.set", {'id': 100, 'on': true, toggle_after: 1000}); //direct
print("Local/relay/100/on/time=1000");
}
if (STUFE < 4) {
Shelly.call("Switch.set", {'id': 100, 'on': false}); //direct
print("Local/relay/100/off");
}
Senden = 0;
STUFENWECHSEL = STUFE;
}
}
//Shelly.call(
//"Sys.SetConfig", {
//config: {device:{name: Aktuell.toFixed(0)+"W ("+STUFE+") : " + Shelly.getComponentStatus("sys").time + " : +"+(energieKonsumWs / 3600000).toFixed(1)+" kWh -"+(energieReturnWs / 3600000).toFixed(2)+" kWh"}},
//},
//function(result, error_code, error_message, userdata) {
//print("error ", error_code, " : ", error_message);
//print("result", JSON.stringify(result));
//}
//);
CounterRefrech
if (CounterRefrech > 1990)
{
//print("CounterRefrech");
CounterRefrech = 1;
Senden = 1;
}
if (CounterSave > 3599)
{
//print("CounterSave");
CounterSave = 0;
SaveCounters();
}
}
}
}
function SetKVS(key, value) {
Shelly.call(
"KVS.Set", {
"key": key,
"value": value,
},
function(result) {
//print("KVS Saved, rev:", result.rev);
}
);
}
function http (url) {
print('http://' + url );
Shelly.call(
"http.request",
{ method: "GET" , timeout: "5" , url: 'http://' + url },
function (response, error_code, error_message, ud) {
//print(JSON.stringify(response));
//print(JSON.stringify(error_code));
//print(JSON.stringify(error_message));
//print(JSON.stringify(ud));
},
null
);
}
function SaveCounters() {
SetKVS("EnergyConsumed", energieKonsumWs );
SetKVS("EnergyReturned", energieReturnWs );
}
Timer.set(500, true, timerHandler, null);
Alles anzeigen