Seite 1 von 2

Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 5:14 pm
von Picha
Hallo zusammen,

ich habe mich nun auch an meine erste Custom Logik gewagt.
Ziel war es den fortlaufenden Gesamtzählerstand des Wärmepumpenzähler einzulesen und die stündliche, tägliche, wöchentliche, monatliche und jährliche Änderung auszugeben.

Der erstellte Code:

Code: Alles auswählen

/**
 * New custom logic
 *
 * 
 */

{
  "_Meta": { // Optional
    "Description": "",
    "Version": "1.00",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
  },

  "Input": [
	  ["akt_Zaehlerstand","aktueller Zaehlerstand","$I_akt_kWh","a"],
		["Trigger_sofort","Trigger zur sofortigen übernahme der kWh","$I_Trigger_sofort","c"]
	
  ],
  "Output": [
		["Verbrauch_Stunde","Verbrauch der letzten Stunde","$Stundenverbrauch","c"],
		["Verbrauch_Tag","Verbrauch eines Tages","$Tagesverbrauch","c"],	
		["Verbrauch_Woche","Verbrauch einer Woche","$Wochenverbrauch","c"],
		["Verbrauch_Mon","Verbrauch eines Monats","$Monatsverbrauch","c"],		
		["Verbrauch_Jahr","Verbrauch eines Jahres","$Jahresverbrauch","c"]		
		
  ],
  "Level": [
		["$I_akt_kWh","float",0.0],
		["$I_Trigger_sofort","bool",false],
		//
		["$Stundenverbrauch","float",0.0],
		["$Tagesverbrauch","float",0.0],
		["$Wochenverbrauch","float",0.0],
		["$Monatsverbrauch","float",0.0],
		["$Jahresverbrauch","float",0.0],
		//
		["$SpeicherStunde","float",0.0],
		["$SpeicherTag","float",0.0],
		["$SpeicherWoche","float",0.0],
		["$SpeicherMonat","float",0.0],
		["$SpeicherJahr","float",0.0],
		["$KonstTrue","bool",true],
		["$KonstFalse","bool",false],
		["$Konst0","float",0.0],
		["$Konst1","float",1.0],
		//
		["$ResetStunde","string","1 0 0-23 * * *"],
		["$ResetTag","string","1 0 0 * * *"],
		["$ResetWoche","string","1 0 0 * * 0"],
		["$ResetMonat","string","1 0 0 1 * *"],
		["$ResetJahr","string","1 0 0 1 1 *"],
		["$ResetStundeTrigger","bool",false],
		["$ResetTagTrigger","bool",false],
		["$ResetWocheTrigger","bool",false],
		["$ResetMonatTrigger","bool",false],
		["$ResetJahrTrigger","bool",false],
		["$UebnStundeTrigger","bool",false],
		["$UebnTagTrigger","bool",false],
		["$UebnWocheTrigger","bool",false],
		["$UebnMonatTrigger","bool",false],
		["$UebnJahrTrigger","bool",false]
  ],
  "Module": [ 
      
        // Trigger zur Übernahme der aktuellen kWh mittels Cron
		["Cron","$KonstTrue","$ResetTagTrigger",0,"$ResetTag"],
		["Cron","$KonstTrue","$ResetWocheTrigger",0,"$ResetWoche"],
		["Cron","$KonstTrue","$ResetMonatTrigger",0,"$ResetMonat"],
		["Cron","$KonstTrue","$ResetJahrTrigger",0,"$ResetJahr"],

		// Cron oder Eingang
		["Or" , ["$ResetStundeTrigger" , "$I_Trigger_sofort"], "$UebnStundeTrigger"],
		["Or" , ["$ResetTagTrigger" , "$I_Trigger_sofort"], "$UebnTagTrigger"],
		["Or" , ["$ResetWocheTrigger" , "$I_Trigger_sofort"], "$UebnWocheTrigger"],
		["Or" , ["$ResetMonatTrigger" , "$I_Trigger_sofort"], "$UebnMonatTrigger"],
		["Or" , ["$ResetJahrTrigger" , "$I_Trigger_sofort"], "$UebnJahrTrigger"],
		
      // Trigger Übernahme der aktuellen kWh in den Speicher
		["Latch","$I_akt_kWh","$SpeicherStunde","$UebnStundeTrigger",0],
		["Latch","$I_akt_kWh","$SpeicherTag","$UebnTagTrigger",0],
		["Latch","$I_akt_kWh","$SpeicherWoche","$UebnWocheTrigger",0],
		["Latch","$I_akt_kWh","$SpeicherMonat","$UebnMonatTrigger",0],
		["Latch","$I_akt_kWh","$SpeicherJahr","$UebnJahrTrigger",0],
		
		// Delta ermitteln
		["Polynomial", "$Konst1", "$Stundenverbrauch",["$I_akt_kWh", "-$SpeicherStunde"]],
		["Polynomial", "$Konst1", "$Tagesverbrauch",["$I_akt_kWh", "-$SpeicherTag"]],
		["Polynomial", "$Konst1", "$Wochenverbrauch",["$I_akt_kWh", "-$SpeicherWoche"]],
		["Polynomial", "$Konst1", "$Monatsverbrauch",["$I_akt_kWh", "-$SpeicherMonat"]],
		["Polynomial", "$Konst1", "$Jahresverbrauch",["$I_akt_kWh", "-$SpeicherJahr"]]

  ]
}
Leider funktioniert die Custom Logik nicht wie erwartet.
Geplant war es durch den Eingang $I_Trigger_sofort die Speicherplätze ($SpeicherStunde... bis ...$SpeicherJahr) mit dem aktuellen Zählerstand zu füllen. Dies ist nur beim ersten Start nötig und wird durch eine händische Umschaltung erledigt.
Danach soll das beschreiben der "Speicher" mittels der Latch Bausteine getriggert durch Crons erfolgen.

Das Delta wird jeweils durch die Polynominal Bausteine ermittelt.

Scheinbar werden die Speicher nicht durch das händische Triggern vom Eingang "$I_Trigger_sofort" beschrieben.
Die Cron Trigger scheinen auch nicht zu arbeiten.

Kann jemand einen Fehler erkennen?
Wurde mich über Tipps und Vorschläge zum vereinfachen/ verbessern der Custom Logik freuen.

Vielen Dank im Voraus
Markus

Re: Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 8:34 pm
von Robosoc
Ich schau es mir gerade nur auf dem Handy an und spontan fällt mir auf, dass der zweite Parameter von CRON bei Dir bereits die Zeiten sind.

Dies müsste aber der letzte Parameter sein
["Cron","$Start","$Alarm","$NextTrigger","$CronExpr"]

Siehe app.php/kb/viewarticle?a=115#Cron

Hilft dir das?

Re: Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 8:36 pm
von Robosoc
Oh, nee, stop, habe mich verlesen... Meinen Beitrag bitte ignorieren... Ich schau mir das nochmal an

Re: Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 8:40 pm
von Robosoc
Meine neue Vermutung auf die schnelle sind die Minuszeichen in den POLYNOMIAL Bausteinen... Ich denke das geht so nicht, du musst wahrscheinlich mit einer Konstanten - 1 multiplizieren.

Re: Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 8:42 pm
von Robosoc
Ahhhh, und ich glaub auch der Hinweis von mir war falsch... Sorry... Jetzt mach ich mal Pause und schau es mir später am Rechner in Ruhe an...

Re: Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 8:47 pm
von Robosoc
Aber bevor ich da nachher rangehe. Was Willst du denn eigentlich am Ende mit den Ergebnissen machen. Willst Du die in Timeseries schreiben und anzeigen lassen? Dann wäre das Logik Modul zwar eine gute Übung, aber eigentlich unnötig, weil das aus dem Logging der Zählerstände in Grafana problemlos "erzeugt" wird.

Re: Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 8:59 pm
von Hammer
Hi Markus,

ich kann so keinen Fehler finden.
Bei mir funktioniert es auch.
Versuche doch die Start Werte statt mit dem Trigger_sofort, mit der Funktion Limiter Comparator (Wenn Wert kleiner 1) zu füllen.

Grüße
Stefan
[Edit: :?]

Re: Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 10:08 pm
von Hammer
Hallo Markus,

ich habe noch meine Änderungen hinzugefügt.

Code: Alles auswählen

/**
 * New custom logic
 *
 * 
 */

{
  "_Meta": { // Optional
    "Description": "",
    "Version": "1.00",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
  },

  "Input": [
	  ["akt_Zaehlerstand","aktueller Zaehlerstand","$I_akt_kWh","a"]
  ],
  "Output": [
		["Verbrauch_Stunde","Verbrauch der letzten Stunde","$Stundenverbrauch","c"],
		["Verbrauch_Tag","Verbrauch eines Tages","$Tagesverbrauch","c"],	
		["Verbrauch_Woche","Verbrauch einer Woche","$Wochenverbrauch","c"],
		["Verbrauch_Mon","Verbrauch eines Monats","$Monatsverbrauch","c"],		
		["Verbrauch_Jahr","Verbrauch eines Jahres","$Jahresverbrauch","c"]		
		
  ],
  "Level": [
		["$I_akt_kWh","float",0.0],
		
		//
		["$Stundenverbrauch","float",0.0],
		["$Tagesverbrauch","float",0.0],
		["$Wochenverbrauch","float",0.0],
		["$Monatsverbrauch","float",0.0],
		["$Jahresverbrauch","float",0.0],
		//
		["$SpeicherStunde","float",0.0],
		["$SpeicherStunde_fuellen","bool",false],
		["$SpeicherTag","float",0.0],
		["$SpeicherTag_fuellen","bool",false],
		["$SpeicherWoche","float",0.0],
		["$SpeicherWoche_fuellen","bool",false],
		["$SpeicherMonat","float",0.0],
		["$SpeicherMonat_fuellen","bool",false],
		["$SpeicherJahr","float",0.0],
		["$SpeicherJahr_fuellen","bool",false],
		["$KonstTrue","bool",true],
		["$KonstFalse","bool",false],
		["$Konst0","float",0.0],
		["$Konst1","float",1.0],
		["$Break","bool",false],
		//
		["$ResetStunde","string","1 0 0-23 * * *"],
		["$ResetTag","string","1 0 0 * * *"],
		["$ResetWoche","string","1 0 0 * * 0"],
		["$ResetMonat","string","1 0 0 1 * *"],
		["$ResetJahr","string","1 0 0 1 1 *"],
		["$ResetStundeTrigger","bool",false],
		["$ResetTagTrigger","bool",false],
		["$ResetWocheTrigger","bool",false],
		["$ResetMonatTrigger","bool",false],
		["$ResetJahrTrigger","bool",false],
		["$UebnStundeTrigger","bool",false],
		["$UebnTagTrigger","bool",false],
		["$UebnWocheTrigger","bool",false],
		["$UebnMonatTrigger","bool",false],
		["$UebnJahrTrigger","bool",false]
  ],
  "Module": [ 
		// Abbruch wenn kein Eingangswert vorhanden
		 ["Comparator" , "$I_akt_kWh" , "$Break" , "$Konst1"]
		,["Break", ["-$Break"]]
		
        // Trigger übernahme der aktuellen kWh in den Speicher wenn dieser leer ist
	   	,["Comparator" , "$SpeicherStunde" , "$SpeicherStunde_fuellen" , "$Konst1"]
		,["Comparator" , "$SpeicherTag" , "$SpeicherTag_fuellen" , "$Konst1"]
		,["Comparator" , "$SpeicherWoche" , "$SpeicherWoche_fuellen" , "$Konst1"]
		,["Comparator" , "$SpeicherMonat" , "$SpeicherMonat_fuellen" , "$Konst1"]
		,["Comparator" , "$SpeicherJahr" , "$SpeicherJahr_fuellen" , "$Konst1"]
		, 
	  	  
        // Trigger zur Übernahme der aktuellen kWh mittels Cron 
		["Cron","$KonstTrue","$ResetStundeTrigger",0,"$ResetStunde"],
		["Cron","$KonstTrue","$ResetTagTrigger",0,"$ResetTag"],
		["Cron","$KonstTrue","$ResetWocheTrigger",0,"$ResetWoche"],
		["Cron","$KonstTrue","$ResetMonatTrigger",0,"$ResetMonat"],
		["Cron","$KonstTrue","$ResetJahrTrigger",0,"$ResetJahr"],

		// Cron oder leerem Speicher
		["Or" , ["$ResetStundeTrigger"  , "-$SpeicherStunde_fuellen"], "$UebnStundeTrigger"],
		["Or" , ["$ResetTagTrigger" 	, "-$SpeicherTag_fuellen"], "$UebnTagTrigger"],
		["Or" , ["$ResetWocheTrigger"   , "-$SpeicherWoche_fuellen"], "$UebnJahrTrigger"],
		["Or" , ["$ResetMonatTrigger"   , "-$SpeicherMonat_fuellen"], "$UebnJahrTrigger"],
		["Or" , ["$ResetJahrTrigger"    , "-$SpeicherJahr_fuellen"], "$UebnJahrTrigger"]
		
		// Übername des Eingang Wert in den Speicher
		,["Latch","$I_akt_kWh","$SpeicherStunde","$UebnStundeTrigger",0]			
		,["Latch","$I_akt_kWh","$SpeicherTag","$UebnTagTrigger",0]				
		,["Latch","$I_akt_kWh","$SpeicherWoche","$UebnJahrTrigger",0]			
		,["Latch","$I_akt_kWh","$SpeicherMonat","$UebnJahrTrigger",0]			
		,["Latch","$I_akt_kWh","$SpeicherJahr","$UebnJahrTrigger",0]
		,
		
		// Delta ermitteln
		["Polynomial", "$Konst1", "$Stundenverbrauch",["$I_akt_kWh", "-$SpeicherStunde"]],
		["Polynomial", "$Konst1", "$Tagesverbrauch",["$I_akt_kWh", "-$SpeicherTag"]],
		["Polynomial", "$Konst1", "$Wochenverbrauch",["$I_akt_kWh", "-$SpeicherWoche"]],
		["Polynomial", "$Konst1", "$Monatsverbrauch",["$I_akt_kWh", "-$SpeicherMonat"]],
		["Polynomial", "$Konst1", "$Jahresverbrauch",["$I_akt_kWh", "-$SpeicherJahr"]]

  ]
}
Ein Break verhindert die Ausführung ohne Eingangswert und wenn der Speicher leer ist wird der automatisch mit dem Eingangswert gefüllt, bevor das Delta berechnet wird.

Grüße
Stefan

Re: Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 10:09 pm
von Picha
Hi Robosoc,

ja, ich schreibe die Werte in eine TS. Dass es auch in Grafana zu lösen sein müsste, habe ich mir auch gedacht. Leider bekomme ich in Grafana noch weniger auf die Reihe..... .
Aus Übungsgründen habe ich mich dann an die Custom Logik gesetzt, was ja auch ein interessantes Thema ist.
Eigentlich würde ich es auch jetzt ganz gerne mit der Logik lösen.

Allen schon mal vielen Dank für die Hilfe.

Gruß Markus

Re: Erstellen der ersten Custom Logik und Fragen

Verfasst: Mi Dez 02, 2020 10:11 pm
von Picha
Hallo Hammer,

schonmal Danke.
Werde deine Anpassungen morgen mal ausprobieren.

Gruß Markus