Seite 1 von 2
Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 15:48
von leupy
Hallo zusammen,
ich versuche mich gerade an meiner Heizungsreglung für mein Wohnzimmer und habe Probleme mit der Regel.
Am Anfang der Regel wollte ich eine Initialisierung der Solltemperaturen machen aber Leider funst die nicht.
Code: Alles auswählen
// Heizung Wohnzimmer
rule "Init Heizung Wohnzimmer"
when
System started
then
if (Heizung_W_Soll.state == Uninitialized)
{
Heizung_W_Soll.postUpdate(21.0)
}
if (Heizung_W_Soll_N.state == Uninitialized)
{
Heizung_W_Soll_N.postUpdate(18.0)
}
end
Item
Code: Alles auswählen
// Heizung
//Wohnzimmer
Number Heizung_W_Soll //Soll Temp. Tag
Number Heizung_W_Soll_N //Soll Temp. nacht
Switch Heizung_W //Stellmotor Heizung
Nach Neustart sieht die Anzeige im Basic UI immer noch so Aus.
Heizung.PNG
Re: Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 15:52
von peter-pan
Hast du schon mal "Uninitialized" (in Gänsefüsschen) probiert ?
Re: Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 16:07
von Cyrelian
Hi leupy,
da die ITEMS nach den Start entweder
NULL oder
UNDEF sind, würde ich es so machen:
Code: Alles auswählen
rule "Init Heizung Wohnzimmer"
when
System started
then
if (Heizung_W_Soll.state === NULL)
{
Heizung_W_Soll.postUpdate(21.0)
}
if (Heizung_W_Soll_N.state === NULL)
{
Heizung_W_Soll_N.postUpdate(18.0)
}
end
CU
Cyrelian
Re: Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 16:07
von leupy
peter-pan hat geschrieben: ↑17. Nov 2019 15:52
Hast du schon mal "Uninitialized" (in Gänsefüsschen) probiert ?
Hallo, hab ich ausprobiert ohne Erfolg.
Re: Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 16:12
von leupy
Hallo Cyrelian,
mit Null anstatt Uninitialized gehts. Ich dachte nur bei Neustart steht da gar kein Wert auch nicht Null ?
Danke und Grüße aus dem schönen Saarland
Re: Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 16:19
von Cyrelian
Hi leupy,
nach einem Neustart stehen ALLE Items, die nicht direkt über ein Things oder aus einer Persistence gesetzt werden auf NULL. Ich meine in OH1 war das noch "Uninitialized". Seit OH2 ist aber NULL der Wert nach den Neustart.
Wichtig ist die Abfrage mit "===" oder "!==" auf NULL.
CU und viele Grüße aus dem Rheinland
Re: Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 16:46
von peter-pan
Sicher dass das so (=== / !==) verglichen wird ? Ich dachte bisher, das gilt nur für
null.
Um den Wert von "Heizung_W_Soll" bzw. "Heizung_W_Soll_N" herauszufinden, kann man ja einfach mal ein
Code: Alles auswählen
logInfo("Heizung Wohnzimmer","W_Soll ist: {} und W_Soll_N ist: {}",Heizung_W_Soll.state, Heizung_W_Soll_N.state)
einbauen und schauen was das System sagt. Aber eigentlich sollten die Werte doch aus dem Binding (Channel) gesetzt werden ?
Re: Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 23:14
von Cyrelian
peter-pan hat geschrieben: ↑17. Nov 2019 16:46
Sicher dass das so (=== / !==) verglichen wird ? Ich dachte bisher, das gilt nur für
null.
Hi Peter,
korrekt, so wie ich oben geschrieben habe:
Wichtig ist die Abfrage mit "===" oder "!==" auf NULL.
Aber bitte aufpassen
null ist
NICHT NULL:
Denn
NULL ist ein Zustand, der anzeigt, dass ein Element nicht initialisiert ist.
null hingegen ist etwas, das nur in Regeln sinnvoll ist (var Timer Poolpumpe = null ) und bedeutet, dass eine Variable keinen Wert hat.
CYA
Cyrelian
Re: Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 23:17
von udo1toni
Ich verwende an einer solchen Stelle lieber die Prüfung auf einen gültigen Wert:
Code: Alles auswählen
rule "Init Heizung Wohnzimmer"
when
System started
then
if (!(Heizung_W_Soll.state instanceof Number)) Heizung_W_Soll.postUpdate(21)
if (!(Heizung_W_Soll_N.state instanceof Number)) Heizung_W_Soll_N.postUpdate(18)
end
Es ist dann egal, welcher ungültige Wert im Item steht (UNINITIALIZED, NULL oder UNDEF)
Re: Regel mit postUpdate ohne Funktion
Verfasst: 17. Nov 2019 23:28
von Cyrelian
udo1toni hat geschrieben: ↑17. Nov 2019 23:17
Ich verwende an einer solchen Stelle lieber die Prüfung auf einen gültigen Wert:
Code: Alles auswählen
rule "Init Heizung Wohnzimmer"
when
System started
then
if (!(Heizung_W_Soll.state instanceof Number)) Heizung_W_Soll.postUpdate(21)
if (!(Heizung_W_Soll_N.state instanceof Number)) Heizung_W_Soll_N.postUpdate(18)
end
Es ist dann egal, welcher ungültige Wert im Item steht (UNINITIALIZED, NULL oder UNDEF)
Definitiv die elegantere Lösung
