[Gelöst]ScriptRuntimeError

Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)

Moderatoren: jmaus, Co-Administratoren

Benutzeravatar
Eli_78
Beiträge: 160
Registriert: 09.09.2017, 13:09
Hat sich bedankt: 18 Mal
Danksagung erhalten: 20 Mal

[Gelöst]ScriptRuntimeError

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

Code: Alles auswählen

local0.err ReGaHss: ERROR: ScriptRuntimeError:
ins log schreibt.

Kann mir da wer sagen, wo der Fehler liegt? Hab glaub gerade Hirn Blockade :shock:

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! :D

MichaelN
Beiträge: 9684
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1627 Mal

Re: ScriptRuntimeError

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.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
Eli_78
Beiträge: 160
Registriert: 09.09.2017, 13:09
Hat sich bedankt: 18 Mal
Danksagung erhalten: 20 Mal

Re: ScriptRuntimeError

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! :D

Tyfys
Beiträge: 551
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 125 Mal

Re: ScriptRuntimeError

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

Benutzeravatar
Eli_78
Beiträge: 160
Registriert: 09.09.2017, 13:09
Hat sich bedankt: 18 Mal
Danksagung erhalten: 20 Mal

Re: ScriptRuntimeError

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! :D

MichaelN
Beiträge: 9684
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1627 Mal

Re: ScriptRuntimeError

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:

Code: Alles auswählen

var a = dom.GetObject("Stromeinspeisung Gesamt 3EM");
Was nicht zulässig ist, ist Value als Zuweisung zu nutzen

Code: Alles auswählen

a.Value(n);
aber das sehe ich hier auch nicht.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

MichaelN
Beiträge: 9684
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1627 Mal

Re: ScriptRuntimeError

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()); }
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
Eli_78
Beiträge: 160
Registriert: 09.09.2017, 13:09
Hat sich bedankt: 18 Mal
Danksagung erhalten: 20 Mal

Re: ScriptRuntimeError

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. :cry:

Merkwürdig, dachte ich hatte diese Variante ganz am Anfang. :shock:

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! :D

MichaelN
Beiträge: 9684
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1627 Mal

Re: ScriptRuntimeError

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.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
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

Re: [Gelöst]ScriptRuntimeError

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:

Code: Alles auswählen

if(fz.Value() >= 0.00)

ergibt immer wahr.

Runtime-Error:

Code: Alles auswählen

{ f.State(fz.Value()); }
weil fz eine Scriptvariable und kein Objekt ist.

Antworten

Zurück zu „RaspberryMatic“