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