Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)
Moderatoren: jmaus, Co-Administratoren
-
Eli_78
- Beiträge: 160
- Registriert: 09.09.2017, 13:09
- Hat sich bedankt: 18 Mal
- Danksagung erhalten: 20 Mal
Beitrag
von Eli_78 » 19.12.2023, 13:53
Hallo zusammen,
Mir ist heute im Syslog aufgefallen das mein Script:
Code: Alles auswählen
! 3EM Zählerstandsberechnung Einspeisung 23.11.2023
! Auslöser finden
var trigger = dom.GetObject("$src$");
! Alle Variabeln laden:
var a = dom.GetObject("Stromeinspeisung Gesamt 3EM");
var c = dom.GetObject("Strom Einspeisung Referenz Woche");
var d = dom.GetObject("Strom Einspeisung Referenz Monat");
var e = dom.GetObject("Strom Einspeisung Referenz Kalenderjahr");
var f = dom.GetObject("Strom Einspeisung heute");
var g = dom.GetObject("Strom Einspeisung Woche");
var h = dom.GetObject("Strom Einspeisung Monat");
var i = dom.GetObject("Strom Einspeisung Kalenderjahr");
var j = dom.GetObject("Strom Einspeisung gestern");
var k = dom.GetObject("Strom Einspeisung letzte Woche");
var l = dom.GetObject("Strom Einspeisung letzter Monat");
var m = dom.GetObject("Strom Einspeisung letztes Kalenderjahr");
var n = dom.GetObject("Strom Einspeisung Referenz Zaehlerstand");
! Einspeisungswerte setzen
if(trigger.Value() == "true")
{
! Berechnungen durchführen. Nur weitermachen wenn es wirklich Mitternacht ist
if(system.Date("%H:%M") == "00:00")
{
! Einspeisung Gestern setzen
j.State(f.Value());
! Einspeisung Referenz Tag setzen
n.State(a.Value());
f.State(0.00);
! Weitermachen, wenn Mitternacht und zugleich Montag
if(system.Date("%a") == "Mon")
{
! Einspeisung letzter Woche setzen
k.State(g.Value());
! Referenz Woche setzen
c.State(n.Value());
! Aktuelle Woche nullen
g.State(0.00);
}
! Weitermachen, wenn Mitternacht und zugleich Monatsanfang
if(system.Date("%d") == "01")
{
! Einspeisung letzten Monats setzen
l.State(h.Value());
! Referenz Monat setzen
d.State(n.Value());
! Aktueller Monat nullen
h.State(0.00);
}
! Weitermachen, wnn Mitternacht, Monatsanfang und zugleich Jahresanfang
if(system.Date("%m:%d") == "01:01")
{
! Einspeisung letztes Jahr setzen
m.State(i.Value());
! Referenz Jahr setzen
e.State(n.Value());
! Aktuelles Jahr nullen
i.State(0.00);
}
}
}
var fz = (a.Value() - n.Value());
if(fz.Value() >= 0.00) { f.State(fz.Value()); }
var gz = (a.Value() - c.Value());
if(gz.Value() >= 0.00) { g.State(gz.Value()); }
var hz = (a.Value() - d.Value());
if(hz.Value() >= 0.00) { h.State(hz.Value()); }
var iz = (a.Value() - e.Value());
if(iz.Value() >= 0.00) { i.State(iz.Value()); }
einen
ins log schreibt.
Kann mir da wer sagen, wo der Fehler liegt? Hab glaub gerade Hirn Blockade
PS: Das Script macht aber das, was es soll.
Grüße Thomas
Zuletzt geändert von
Eli_78 am 19.12.2023, 16:40, insgesamt 1-mal geändert.
Intel NUC (NUC6CAYH) 8GB Ram, 60GB SSD + RPI-RF-MOD auf HB-RF-USB-2 + APC USV via Nut Server (Master)
IOBroker auf RPI3B+
1262 Kanäle in 323 Geräten und 127 CUxD-Kanäle in 16 CUxD-Geräten
Und der ganze Haufen funktioniert auch noch!
-
MichaelN
- Beiträge: 9684
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 700 Mal
- Danksagung erhalten: 1627 Mal
Beitrag
von MichaelN » 19.12.2023, 13:58
Ein schneller Test mit dem SDV bescheinigt Syntaktisch korrekten Code. Also muss es ein race condition sein. Sprichst Du einen Datenpunkt an, den es nicht (mehr) gibt?
Oder stolperst Du schlicht darüber, das Du die Systemvariablen unspezifisch referenzierst und dadurch stattdessen ein Gerät oder Kanal erwischt?
Pack selber ein paar Log Ausgaben ins Skript um festzustellen wo genau der Fehler geworfen wird.
-
Eli_78
- Beiträge: 160
- Registriert: 09.09.2017, 13:09
- Hat sich bedankt: 18 Mal
- Danksagung erhalten: 20 Mal
Beitrag
von Eli_78 » 19.12.2023, 15:37
Servus Michael
Wenn ich den letzten Block ausklammere
Code: Alles auswählen
var fz = (a.Value() - n.Value());
if(fz.Value() >= 0.00) { f.State(fz.Value()); }
var gz = (a.Value() - c.Value());
if(gz.Value() >= 0.00) { g.State(gz.Value()); }
var hz = (a.Value() - d.Value());
if(hz.Value() >= 0.00) { h.State(hz.Value()); }
var iz = (a.Value() - e.Value());
if(iz.Value() >= 0.00) { i.State(iz.Value()); }
wird kein Error in log geschrieben.
Alle Sysvars sind vorhanden und es gibt keine Doppelbelegung von Namen.
Und wie gesagt, das Skript tut was es soll. Alle Sysvars werden korrekt befüllt.
Ich blicks grad ned.
Grüße Thomas
Intel NUC (NUC6CAYH) 8GB Ram, 60GB SSD + RPI-RF-MOD auf HB-RF-USB-2 + APC USV via Nut Server (Master)
IOBroker auf RPI3B+
1262 Kanäle in 323 Geräten und 127 CUxD-Kanäle in 16 CUxD-Geräten
Und der ganze Haufen funktioniert auch noch!
-
Tyfys
- Beiträge: 551
- Registriert: 17.04.2021, 17:12
- System: CCU
- Hat sich bedankt: 27 Mal
- Danksagung erhalten: 125 Mal
Beitrag
von Tyfys » 19.12.2023, 15:47
.Value() auf eine interne Scriptvariable angewendet kommt mir komisch vor.
das sollte doch so genügen :
Code: Alles auswählen
var fz = (a.Value() - n.Value());
if(fz >= 0.00) { f.State(fz); }
natürlich auch die anderen Fälle
Gruß
Harry
-
Eli_78
- Beiträge: 160
- Registriert: 09.09.2017, 13:09
- Hat sich bedankt: 18 Mal
- Danksagung erhalten: 20 Mal
Beitrag
von Eli_78 » 19.12.2023, 15:51
Hab ich auch schon durch. Die Variation wirft den gleichen Fehler, funktioniert aber auch.
Intel NUC (NUC6CAYH) 8GB Ram, 60GB SSD + RPI-RF-MOD auf HB-RF-USB-2 + APC USV via Nut Server (Master)
IOBroker auf RPI3B+
1262 Kanäle in 323 Geräten und 127 CUxD-Kanäle in 16 CUxD-Geräten
Und der ganze Haufen funktioniert auch noch!
-
MichaelN
- Beiträge: 9684
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 700 Mal
- Danksagung erhalten: 1627 Mal
Beitrag
von MichaelN » 19.12.2023, 15:57
Tyfys hat geschrieben: ↑19.12.2023, 15:47
.Value() auf eine interne Scriptvariable angewendet kommt mir komisch vor.
Diese Variablen sind ja Objekte, wenn auch nicht so definiert:
Was nicht zulässig ist, ist Value als Zuweisung zu nutzen
aber das sehe ich hier auch nicht.
-
MichaelN
- Beiträge: 9684
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 700 Mal
- Danksagung erhalten: 1627 Mal
Beitrag
von MichaelN » 19.12.2023, 15:58
setzt mal mehr Klammern ein:
Code: Alles auswählen
var fz = ( (a.Value()) - (n.Value()) );
if( (fz.Value()) >= 0.00) { f.State(fz.Value()); }
-
Eli_78
- Beiträge: 160
- Registriert: 09.09.2017, 13:09
- Hat sich bedankt: 18 Mal
- Danksagung erhalten: 20 Mal
Beitrag
von Eli_78 » 19.12.2023, 16:07
Glaub Tyfys hatte recht. Die Variante :
Code: Alles auswählen
! 3EM Zählerstandsberechnung Einspeisung 23.11.2023 von Eli
! Auslöser finden
var trigger = dom.GetObject("$src$");
! Alle Variabeln laden:
var a = dom.GetObject("Stromeinspeisung Gesamt 3EM");
var c = dom.GetObject("Strom Einspeisung Referenz Woche");
var d = dom.GetObject("Strom Einspeisung Referenz Monat");
var e = dom.GetObject("Strom Einspeisung Referenz Kalenderjahr");
var f = dom.GetObject("Strom Einspeisung heute");
var g = dom.GetObject("Strom Einspeisung Woche");
var h = dom.GetObject("Strom Einspeisung Monat");
var i = dom.GetObject("Strom Einspeisung Kalenderjahr");
var j = dom.GetObject("Strom Einspeisung gestern");
var k = dom.GetObject("Strom Einspeisung letzte Woche");
var l = dom.GetObject("Strom Einspeisung letzter Monat");
var m = dom.GetObject("Strom Einspeisung letztes Kalenderjahr");
var n = dom.GetObject("Strom Einspeisung Referenz Zaehlerstand");
! Einspeisungswerte setzen
if(trigger.Value() == "true")
{
! Berechnungen durchführen. Nur weitermachen wenn es wirklich Mitternacht ist
if(system.Date("%H:%M") == "00:00")
{
! Einspeisung Gestern setzen
j.State(f.Value());
! Einspeisung Referenz Tag setzen
n.State(a.Value());
f.State(0.00);
! Weitermachen, wenn Mitternacht und zugleich Montag
if(system.Date("%a") == "Mon")
{
! Einspeisung letzter Woche setzen
k.State(g.Value());
! Referenz Woche setzen
c.State(n.Value());
! Aktuelle Woche nullen
g.State(0.00);
}
! Weitermachen, wenn Mitternacht und zugleich Monatsanfang
if(system.Date("%d") == "01")
{
! Einspeisung letzten Monats setzen
l.State(h.Value());
! Referenz Monat setzen
d.State(n.Value());
! Aktueller Monat nullen
h.State(0.00);
}
! Weitermachen, wnn Mitternacht, Monatsanfang und zugleich Jahresanfang
if(system.Date("%m:%d") == "01:01")
{
! Einspeisung letztes Jahr setzen
m.State(i.Value());
! Referenz Jahr setzen
e.State(n.Value());
! Aktuelles Jahr nullen
i.State(0.00);
}
}
}
var fz = (a.Value() - n.Value());
if(fz >= 0.00) { f.State(fz); }
var gz = (a.Value() - c.Value());
if(gz >= 0.00) { g.State(gz); }
var hz = (a.Value() - d.Value());
if(hz >= 0.00) { h.State(hz); }
var iz = (a.Value() - e.Value());
if(iz >= 0.00) { i.State(iz); }
Wirft keinen Fehler! Kann aber leider im Moment nicht testen, ob die Variablen noch befüllt werden. Die PV Anlage produziert heute nicht mehr.
Merkwürdig, dachte ich hatte diese Variante ganz am Anfang.
Grüße Thomas
Intel NUC (NUC6CAYH) 8GB Ram, 60GB SSD + RPI-RF-MOD auf HB-RF-USB-2 + APC USV via Nut Server (Master)
IOBroker auf RPI3B+
1262 Kanäle in 323 Geräten und 127 CUxD-Kanäle in 16 CUxD-Geräten
Und der ganze Haufen funktioniert auch noch!
-
MichaelN
- Beiträge: 9684
- Registriert: 27.04.2020, 10:34
- System: CCU
- Hat sich bedankt: 700 Mal
- Danksagung erhalten: 1627 Mal
Beitrag
von MichaelN » 19.12.2023, 16:12
Eli_78 hat geschrieben: ↑19.12.2023, 16:07
Glaub Tyfys hatte recht.
Ja, hat er. Ich hatte nicht gesehen , das fz nur eine normale Variable ist und kein Objekt, wie die anderen.
Soviel zur sinnigen Benamung.
-
Baxxy
- Beiträge: 10847
- Registriert: 18.12.2018, 15:45
- System: Alternative CCU (auf Basis OCCU)
- Hat sich bedankt: 610 Mal
- Danksagung erhalten: 2229 Mal
Beitrag
von Baxxy » 19.12.2023, 19:30
Wurde das Script eigentlich jemals auf korrekte logische Abarbeitung getestet?
Harry hat ja gleich beide Fehler korrigiert, wovon einer die Logik aushebelte und der andere zum Script Runtime Error führte.
Logik-Fehler:
ergibt
immer wahr.
Runtime-Error:
weil fz eine Scriptvariable und kein Objekt ist.