Rules

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

matze.lingen
Beiträge: 52
Registriert: 28. Jul 2018 18:35
Answers: 0

Re: Rules

Beitrag von matze.lingen »

Ich habe die neue Rule mal eingepflegt.
Hier ein Auszug aus dem Eventlog:

Code: Alles auswählen

2019-02-05 12:59:16.875 [vent.ItemStateChangedEvent] - Kuechen_Licht changed from OFF to ON
2019-02-05 13:00:58.956 [vent.ItemStateChangedEvent] - Stall_Temp changed from 4.70 to 4.80
2019-02-05 13:00:59.000 [vent.ItemStateChangedEvent] - Stall_F changed from 94.60 to 94.50
2019-02-05 13:01:06.067 [vent.ItemStateChangedEvent] - Flur_Lampe2 changed from ON to OFF
2019-02-05 13:04:41.687 [vent.ItemStateChangedEvent] - Kueche_Temperatur changed from 22.50 to 22.60
2019-02-05 13:05:17.196 [vent.ItemStateChangedEvent] - Wohnzimmer_Temperatur changed from 22.40 to 22.50
2019-02-05 13:05:53.041 [vent.ItemStateChangedEvent] - Stall_F changed from 94.50 to 94.80
2019-02-05 13:06:54.852 [vent.ChannelTriggeredEvent] - homematic:HMW-IO-12-Sw7-DR:CCU1:HEQ0143048:6#PRESS triggered SHORT
2019-02-05 13:06:56.821 [vent.ItemStateChangedEvent] - Kuechen_Licht changed from ON to OFF
2019-02-05 13:07:08.147 [vent.ItemStateChangedEvent] - Flur_Lampe2 changed from OFF to ON
2019-02-05 13:07:08.653 [vent.ChannelTriggeredEvent] - homematic:HMW-IO-12-Sw7-DR:CCU1:HEQ0143048:11#PRESS triggered SHORT
2019-02-05 13:07:19.672 [vent.ChannelTriggeredEvent] - homematic:HMW-IO-12-Sw7-DR:CCU1:HEQ0143048:11#PRESS triggered SHORT
2019-02-05 13:07:24.699 [vent.ChannelTriggeredEvent] - homematic:HMW-IO-12-Sw7-DR:CCU1:HEQ0143048:11#PRESS triggered SHORT
2019-02-05 13:07:32.797 [vent.ChannelTriggeredEvent] - homematic:HMW-IO-12-Sw7-DR:CCU1:HEQ0143048:11#PRESS triggered SHORT
2019-02-05 13:09:07.748 [vent.ChannelTriggeredEvent] - homematic:HMW-IO-12-Sw7-DR:CCU1:HEQ0143048:11#PRESS triggered SHORT
2019-02-05 13:09:18.042 [vent.ChannelTriggeredEvent] - homematic:HMW-IO-12-Sw7-DR:CCU1:HEQ0143048:11#PRESS triggered SHORT
2019-02-05 13:09:20.403 [vent.ChannelTriggeredEvent] - homematic:HMW-IO-12-Sw7-DR:CCU1:HEQ0143048:11#PRESS triggered SHORT
2019-02-05 13:09:25.981 [vent.ChannelTriggeredEvent] - homematic:HMW-IO-12-Sw7-DR:CCU1:HEQ0143048:11#PRESS triggered SHORT
2019-02-05 13:10:06.198 [vent.ItemStateChangedEvent] - Kueche_Temperatur changed from 22.60 to 22.70
2019-02-05 13:10:18.162 [vent.ItemStateChangedEvent] - Schlaf_Temperatur changed from 16.10 to 16.20
2019-02-05 13:10:40.888 [vent.ItemStateChangedEvent] - Stall_F changed from 94.80 to 94.40
2019-02-05 13:11:26.929 [vent.ItemStateChangedEvent] - Flur_Lampe2 changed from ON to OFF
2019-02-05 13:12:26.652 [vent.ItemStateChangedEvent] - Kueche_Temperatur changed from 22.70 to 22.80
2019-02-05 13:15:08.916 [vent.ItemStateChangedEvent] - Wohnzimmer_Temperatur changed from 22.50 to 22.60
2019-02-05 13:15:33.631 [vent.ItemStateChangedEvent] - Stall_F changed from 94.40 to 94.30
2019-02-05 13:17:28.674 [vent.ItemStateChangedEvent] - Kueche_Temperatur changed from 22.80 to 22.90
2019-02-05 13:22:36.924 [vent.ItemStateChangedEvent] - Kueche_Temperatur changed from 22.90 to 23.00
2019-02-05 13:23:12.378 [vent.ItemStateChangedEvent] - Schlaf_Temperatur changed from 16.20 to 16.30
2019-02-05 13:25:11.398 [vent.ItemStateChangedEvent] - Stall_Temp changed from 4.80 to 4.90
2019-02-05 13:32:49.684 [vent.ItemStateChangedEvent] - Schlaf_Temperatur changed from 16.30 to 16.40
2019-02-05 13:35:25.924 [vent.ItemStateChangedEvent] - Schlaf_Temperatur changed from 16.40 to 16.30
2019-02-05 13:37:47.671 [vent.ItemStateChangedEvent] - Schlaf_Temperatur changed from 16.30 to 16.40
2019-02-05 13:38:19.677 [vent.ItemStateChangedEvent] - Kueche_Temperatur changed from 23.00 to 22.90
2019-02-05 13:39:44.052 [vent.ItemStateChangedEvent] - Stall_F changed from 94.30 to 94.20

Code: Alles auswählen

2019-02-05 10:52:36.972 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Text
2019-02-05 10:52:36.972 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Text
2019-02-05 10:52:36.973 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Luft_Wohzimmer' for widget org.eclipse.smarthome.model.sitemap.Text
2019-02-05 10:52:36.974 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Luft_Wohzimmer' for widget org.eclipse.smarthome.model.sitemap.Text
2019-02-05 10:52:36.974 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Text
2019-02-05 10:52:36.975 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Text
2019-02-05 10:54:56.508 [INFO ] [.eclipse.smarthome.model.script.bot1] - Temperaturänderung erkannt.
2019-02-05 10:59:49.712 [INFO ] [.eclipse.smarthome.model.script.bot1] - Temperaturänderung erkannt.
2019-02-05 11:09:31.808 [INFO ] [.eclipse.smarthome.model.script.bot1] - Temperaturänderung erkannt.
2019-02-05 11:19:11.337 [INFO ] [.eclipse.smarthome.model.script.bot1] - Temperaturänderung erkannt.
Kann es sein das die Logs nicht in den Events sondern im Openhab Log stehen?

mamoel
Beiträge: 137
Registriert: 12. Jan 2019 19:56
Answers: 0

Re: Rules

Beitrag von mamoel »

Ja, das ist definitiv der Fall.
openHAB 2.5 (M1) in Docker auf NAS: Synology DS418play
mit Homematic, Hue, TP-Link, AVM Fritz!, FritzboxTR064, Nuki, Amazon Echo, Sonos, Harmony, zigbee2mqtt, Denon/Marantz, ...

matze.lingen
Beiträge: 52
Registriert: 28. Jul 2018 18:35
Answers: 0

Re: Rules

Beitrag von matze.lingen »

ok dann habe ich flasch geguckt. dann funzt iwas in der letzte test regel aber nicht die eigentliche regel

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Rules

Beitrag von peter-pan »

Hallo Zusammen,

ich hab mich mal hingesetzt und alle möglichen Szenarien durchgespielt, bleibe aber irgendwie immer an dem Problem QuantityType hängen.

Dazu habe ich zwei Items genommen. Ein Number Item und ein Item Quantity.

Code: Alles auswählen

Number CPU_Temp_num           "CPU-OH2-Pi Temperatur [%.1f °C]"     <temperature> (Chart_Sys_Temp)
Number:Temperature   localCurrentTemperature                 "Current temperature [%.1f %unit%]"                           <temperature>  (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#temperature" }
Das Problem scheint sich in der Abfrage des Typs (instanceof) zu postulieren, bzw. danach, wenn der Item-Wert mit der Konstante (0, 5, 10) verglichen wird.
Hier mein Test-Rules-File:

Code: Alles auswählen

/*
rule "Temp_Stal_rule"
when
    Item Dummyx changed to ON or
    Item localCurrentTemperature changed
then
    var nTempPrev = (localCurrentTemperature.previousState.state) as Number
        logInfo("test","nTempPrev " + nTempPrev)
    var nTemp = (localCurrentTemperature.state as Number).floatValue
        logInfo("test","nTemp " + nTemp)
    if(nTemp < 0) {
       logInfo("test", "Stall Temperatur ist nun {}",nTemp)
    }
end

// Stall_Temp mit Number Item
// Number CPU_Temp_num           "CPU-OH2-Pi Temperatur [%.1f °C]"     <temperature> (Chart_Sys_Temp)

rule "Temp_Stal1_rule"

when
    Item CPU_Temp_num changed

then
    logInfo("bot1", "Temperaturänderung erkannt.")
    if(CPU_Temp_num.state instanceof Number) {
        logInfo("bot1","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
        var Number nTemp = CPU_Temp_num.state as Number
        var Number nTempPrev = previousState as Number
        
        logInfo("bot1", "Neuer Wert: " + nTemp)
        logInfo("bot1", "Letzter Wert: " + nTempPrev)

        if(nTemp <= 0 && nTempPrev > 0) {
           logInfo("bot1", "Temperatur unter 0")
           //sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -5 && nTempPrev > -5) {
           logInfo("bot1", "Temperatur unter -5")
           //sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -10 && nTempPrev > -10) {
           logInfo("bot1", "Temperatur unter -10")
           //sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
        }

    }
end
// Stall 1 mit QuantityItem
// Number:Temperature   localCurrentTemperature                 "Current temperature [%.1f %unit%]"                           <temperature>  (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#temperature" }

rule "Temp_Stal11_rule"

when
    Item localCurrentTemperature changed

then
    logInfo("bot2", "Temperaturänderung erkannt")
        var Number nTemp = localCurrentTemperature.state as QuantityType<Number>
        var Number nTempPrev = previousState as QuantityType<Number>
        logInfo("bot2", "Neuer Wert: " + nTemp)
        logInfo("bot2", "Letzter Wert: " + nTempPrev)
        
    if(localCurrentTemperature.state as QuantityType<Number>) {
        logInfo("bot2","Temperaturstatus ist vom Typ QuantityType.") //ist das nicht der Fall, wird auch nichts ausgeführt
        var Number nTemp = localCurrentTemperature.state as QuantityType<Number>
        var Number nTempPrev = previousState as QuantityType<Number>
        
        logInfo("bot2", "Neuer Wert: " + nTemp)
        logInfo("bot2", "Letzter Wert: " + nTempPrev)

        if(nTemp <= 0 && nTempPrev > 0) {
           logInfo("bot2", "Temperatur unter 0")
           //sendTelegram("bot2", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -5 && nTempPrev > -5) {
           logInfo("bot2", "Temperatur unter -5")
           //sendTelegram("bot2", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -10 && nTempPrev > -10) {
           logInfo("bot2", "Temperatur unter -10")
           //sendTelegram("bot2", "Stall Temperatur ist nun {}",nTemp)
        }

    }
end

rule "Temp_Stal111_rule"

when
    Item localCurrentTemperature changed

then
    logInfo("bot3", "Temperaturänderung erkannt.")
    if(localCurrentTemperature.state instanceof Number) {
        logInfo("bot3","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
        var Number nTemp = localCurrentTemperature.state as Number
        var Number nTempPrev = previousState as Number
        
        logInfo("bot3", "Neuer Wert: " + nTemp)
        logInfo("bot3", "Letzter Wert: " + nTempPrev)

        if(nTemp <= 0 && nTempPrev > 0) {
           logInfo("bot3", "Temperatur unter 0")
           //sendTelegram("bot3", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -5 && nTempPrev > -5) {
           logInfo("bot3", "Temperatur unter -5")
           //sendTelegram("bot3", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -10 && nTempPrev > -10) {
           logInfo("bot3", "Temperatur unter -10")
           //sendTelegram("bot3", "Stall Temperatur ist nun {}",nTemp)
        }

    }
end

rule "Temp_Stal1111_rule"

when
    Item localCurrentTemperature changed

then
    logInfo("bot4", "Temperaturänderung erkannt.")
    if(localCurrentTemperature.state instanceof Number) {
        logInfo("bot4","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
        var Number nTemp = localCurrentTemperature.state as Number
        var Number nTempPrev = previousState as Number
        
        logInfo("bot4", "Neuer Wert: " + nTemp)
        logInfo("bot4", "Letzter Wert: " + nTempPrev)

        if(nTemp <= 0 && nTempPrev > 0) {
           logInfo("bot4", "Temperatur unter 0")
           //sendTelegram("bot4", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -5 && nTempPrev > -5) {
           logInfo("bot4", "Temperatur unter -5")
           //sendTelegram("bot4", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -10 && nTempPrev > -10) {
           logInfo("bot4", "Temperatur unter -10")
           //sendTelegram("bot4", "Stall Temperatur ist nun {}",nTemp)
        }

    }
end
*/
// Stall  mit QuantityItem
// Number:Temperature   localCurrentTemperature                 "Current temperature [%.1f %unit%]"                           <temperature>  (gOWM,gOWMOutlook)  { channel="openweathermap:weather-and-forecast:api:local:current#temperature" }
rule "Temp_Stal_x_rule"
when
    Item Dummyx changed to ON or
    Item localCurrentTemperature changed
then
    var nTempPrev = (localCurrentTemperature.previousState.state) as Number
        logInfo("bot5","nTempPrev " + nTempPrev)
    var nTemp = (localCurrentTemperature.state as Number).floatValue
        logInfo("bot5","nTemp " + nTemp)
    if(nTemp < 0) {
       logInfo("bot5", "Stall Temperatur ist nun {}",nTemp)
    }
//erster If-Teil
//if(localCurrentTemperature.state as QuantityType<Number>) {
if(localCurrentTemperature.state instanceof QuantityType) {
        /* if(localCurrentTemperature.state instanceof QuantityType) {
        Es wird diese Meldung im Logger ausgegeben:
        2019-02-06 16:03:57.650 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'stall_temp.rules', using it anyway:
        QuantityType is a raw type. References to generic type QuantityType<T> should be parameterized
        Aber auch das Anhängen von <Temperature> oder <Number> bringt Warnungen
        */
        logInfo("bot5","Temperaturstatus ist vom Typ QuantityType.") //ist das nicht der Fall, wird auch nichts ausgeführt
        var Number nTemp = localCurrentTemperature.state as QuantityType<Number>
        var Number nTempPrev = previousState as QuantityType<Number>
        
        logInfo("bot5", "Neuer Wert: " + nTemp)
        logInfo("bot5", "Letzter Wert: " + nTempPrev)

        if(nTemp <= 0 && nTempPrev > 0) {
           logInfo("bot5", "Temperatur unter 0")
           //sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -5 && nTempPrev > -5) {
           logInfo("bot5", "Temperatur unter -5")
           //sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -10 && nTempPrev > -10) {
           logInfo("bot5", "Temperatur unter -10")
           //sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
        }

    }
//zweiter If-Teil
if(localCurrentTemperature.state instanceof Number) {
        logInfo("bot5","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
        var Number nTemp = (localCurrentTemperature.state as Number).floatValue
        var Number nTempPrev = (previousState as Number).floatValue
        
        logInfo("bot5", "Neuer Wert-Float: " + nTemp)
        logInfo("bot5", "Letzter Wert-Float: " + nTempPrev)

        if(nTemp <= 0 && nTempPrev > 0) {
           logInfo("bot5", "Temperatur unter 0")
           //sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -5 && nTempPrev > -5) {
           logInfo("bot5", "Temperatur unter -5")
           //sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -10 && nTempPrev > -10) {
           logInfo("bot5", "Temperatur unter -10")
           //sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
        }

    }
    end
// Stall mit Number Item
// Number CPU_Temp_num           "CPU-OH2-Pi Temperatur [%.1f °C]"     <temperature> (Chart_Sys_Temp)

rule "Temp_Stal_y_rule"
when
    Item Dummyx changed to ON or
    Item CPU_Temp_num changed
then
    var nTempPrev = (CPU_Temp_num.previousState.state) as Number
        logInfo("bot6","nTempPrev " + nTempPrev)
    var nTemp = (CPU_Temp_num.state as Number).floatValue
        logInfo("bot6","nTemp " + nTemp)
    // If-Clause ohne Type-Abfrage
       if(nTemp < 0) {
       logInfo("bot6", "Stall Temperatur ist nun {}",nTemp)
    }
    // erste If-Clause mit Quantity
if(CPU_Temp_num.state instanceof QuantityType) {
        logInfo("bot6","Temperaturstatus ist vom Typ Quantity.") //ist das nicht der Fall, wird auch nichts ausgeführt
        var Number nTemp = CPU_Temp_num.state as Number
        var Number nTempPrev = previousState as Number
        
        logInfo("bot6", "Neuer Wert: " + nTemp)
        logInfo("bot6", "Letzter Wert: " + nTempPrev)

        if(nTemp <= 0 && nTempPrev > 0) {
           logInfo("bot6", "Temperatur unter 0")
           //sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -5 && nTempPrev > -5) {
           logInfo("bot6", "Temperatur unter -5")
           //sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -10 && nTempPrev > -10) {
           logInfo("bot6", "Temperatur unter -10")
           //sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
        }

    }
    // zweite If-Clause mit Number
if(CPU_Temp_num.state instanceof Number) {
        logInfo("bot6","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
        var Number nTemp = CPU_Temp_num.state as Number
        var Number nTempPrev = previousState as Number
        
        logInfo("bot6", "Neuer Wert: " + nTemp)
        logInfo("bot6", "Letzter Wert: " + nTempPrev)

        if(nTemp <= 0 && nTempPrev > 0) {
           logInfo("bot6", "Temperatur unter 0")
           //sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -5 && nTempPrev > -5) {
           logInfo("bot6", "Temperatur unter -5")
           //sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -10 && nTempPrev > -10) {
           logInfo("bot6", "Temperatur unter -10")
           //sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
        }

    }
end

Nicht erschrecken, die meisten Tests sind auskommentiert. Lediglich die beiden Letzten Rules (Temp_Stal_x_rule und Temp_Stal_y_rule) sind noch interessant. Einmal mit Abfrage auf Quantity (erste grosse If-Clause) und einmal auf Number (zweite grosse If-Clause). Wobei für Matze die zweite (Temp_Stal_y_rule mit "bot6" Log) interessanter sein dürfte, da er ja ein Number-Item hat.

Es sollten dann solche, oder ähnliche Meldungen i,m Logger erscheinen:

Code: Alles auswählen

2019-02-06 16:59:30.340 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'stall_temp.rules', using it anyway:
QuantityType is a raw type. References to generic type QuantityType<T> should be parameterized
QuantityType is a raw type. References to generic type QuantityType<T> should be parameterized
2019-02-06 16:59:30.460 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'stall_temp.rules'
2019-02-06 17:03:23.740 [INFO ] [.eclipse.smarthome.model.script.bot6] - nTempPrev 49.38
2019-02-06 17:03:23.748 [INFO ] [.eclipse.smarthome.model.script.bot6] - nTemp 49.38
2019-02-06 17:03:23.756 [INFO ] [.eclipse.smarthome.model.script.bot6] - Temperaturstatus ist vom Typ Number.
2019-02-06 17:03:23.762 [INFO ] [.eclipse.smarthome.model.script.bot6] - Neuer Wert: 49.38
2019-02-06 17:03:23.768 [INFO ] [.eclipse.smarthome.model.script.bot6] - Letzter Wert: 48.31
2019-02-06 17:03:40.261 [INFO ] [.eclipse.smarthome.model.script.bot5] - nTempPrev -1.4
2019-02-06 17:03:40.269 [INFO ] [.eclipse.smarthome.model.script.bot5] - nTemp -15.0
2019-02-06 17:03:40.275 [INFO ] [.eclipse.smarthome.model.script.bot5] - Stall Temperatur ist nun -15.0
2019-02-06 17:03:40.280 [INFO ] [.eclipse.smarthome.model.script.bot5] - Temperaturstatus ist vom Typ QuantityType.
2019-02-06 17:03:40.287 [INFO ] [.eclipse.smarthome.model.script.bot5] - Neuer Wert: -15.0 °C
2019-02-06 17:03:40.293 [INFO ] [.eclipse.smarthome.model.script.bot5] - Letzter Wert: -6.0 °C
2019-02-06 17:03:40.319 [INFO ] [.eclipse.smarthome.model.script.bot5] - Temperaturstatus ist vom Typ Number.
2019-02-06 17:03:40.330 [INFO ] [.eclipse.smarthome.model.script.bot5] - Neuer Wert-Float: -15.0
2019-02-06 17:03:40.335 [INFO ] [.eclipse.smarthome.model.script.bot5] - Letzter Wert-Float: -6.0
2019-02-06 17:03:40.355 [INFO ] [.eclipse.smarthome.model.script.bot5] - Temperatur unter -10
2019-02-06 17:04:24.055 [INFO ] [.eclipse.smarthome.model.script.bot5] - nTempPrev -1.4
2019-02-06 17:04:24.067 [INFO ] [.eclipse.smarthome.model.script.bot5] - nTemp -8.0
Die inneren If-Statements habe ich nicht genauer betrachtet.
Aber wenn ich das Logging von Matze betrachte, läuft das letzte Rule_Beispiel von mamoel (ohne If's) ja, was mich in meiner Vermutung des Problems mit der äusseren If-Klausel bestärkt.
Hoffe ihr könnt damit was anfangen.

P.S. Beim Testen bitte die Item-Namen nicht vergessen zu ändern ;)
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

mamoel
Beiträge: 137
Registriert: 12. Jan 2019 19:56
Answers: 0

Re: Rules

Beitrag von mamoel »

Weiter kommen wir mit dem Thema nur, wenn wir ein Log mit der nicht funktionierenden Rule sehen. Selbst wenn der Temperaturstatus nicht vom Typ QuantityType wäre (warum auch immer) müsste ja etwas ins Log geschrieben werden.
openHAB 2.5 (M1) in Docker auf NAS: Synology DS418play
mit Homematic, Hue, TP-Link, AVM Fritz!, FritzboxTR064, Nuki, Amazon Echo, Sonos, Harmony, zigbee2mqtt, Denon/Marantz, ...

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Rules

Beitrag von peter-pan »

Das ist natürlich richtig @mamoel, dass die Rule erst richtig laufen muss. Aufgrund des letzten Loggings, bin ich allerdings davon ausgegangen, dass sie das tut.
matze.lingen hat geschrieben: 5. Feb 2019 13:49 2019-02-05 10:54:56.508 [INFO ] [.eclipse.smarthome.model.script.bot1] - Temperaturänderung erkannt.
2019-02-05 10:59:49.712 [INFO ] [.eclipse.smarthome.model.script.bot1] - Temperaturänderung erkannt.
Ich wollte nur ein paar Vorschläge machen, da mich das Thema selbst betrifft und ich an einer Lösung auch interessiert bin.

Ausserdem sollte Matze, entweder ein Item mit dem Namen "Luft_Wohnzimmer" in einer .items Datei anlegen, oder diese(s) in der sitemap löschen.
matze.lingen hat geschrieben: 5. Feb 2019 13:49 2019-02-05 10:52:36.973 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Luft_Wohzimmer' for widget org.eclipse.smarthome.model.sitemap.Text
Gruss - Peter
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

Benutzeravatar
udo1toni
Beiträge: 15246
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Rules

Beitrag von udo1toni »

Vermutlich hat sich da was geändert.

Ich hab momentan keine Idee, wie man die Einheit los werden kann. Der Vergleich funktioniert aber auch, wenn man der Zahl die Einheit verpasst, der sie fehlt:

Code: Alles auswählen

rule "Temp_Stal_rule"

when
    Item Stall_Temp changed
then
    if(Stall_Temp.state instanceof Number) {
        val Number nTemp = Stall_Temp.state as Number
        val prevVal nTempPrev = previousState as Number
        if((nTemp <=   0|°C && nTempPrev >   0|°C) ||
           (nTemp <=  -5|°C && nTempPrev >  -5|°C) ||
           (nTemp <= -10|°C && nTempPrev > -10|°C)) {
           sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
        }
    }
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Rules

Beitrag von peter-pan »

Hallo Zusammen,

die Einheit loswerden tu ich z. B. so

Code: Alles auswählen

var nTemp = (CPU_Temp_num.state as Number).floatValue
Aber ich glaube es war das "... instanceof QuantityType".

So wie @udo1toni es gerade beschrieben hat mit "... instanceof Number" müsste es klappen, allerdings braucht es dann die Einheiten nicht mehr, da das Item von Matze ein "Number Item" ist.

Was mich jetzt noch interessieren würde, wäre
udo1toni hat geschrieben: 6. Feb 2019 22:20 val prevVal nTempPrev = previousState as Number
was bedeuted das genau (preVal) ? ich hab das so noch nirgends gesehen.

Gruss Peter
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

mamoel
Beiträge: 137
Registriert: 12. Jan 2019 19:56
Answers: 0

Re: Rules

Beitrag von mamoel »

Das prevVal muss raus aus der Zeile (Tippfehler).

Die beiden Zeilen müssen so lauten:

Code: Alles auswählen

val Number nTemp = Stall_Temp.state as QuantityType<Number>
val Number nTempPrev = previousState as QuantityType<Number>
...und in einer eigenen Rule von mir habe ich einen ähnlichen Fall (Wert von meinem Homematic Stromzähler HM-ES-TX-WM), wo ich das - auf das aktuelle Problem angepasst - so gelöst habe:

Code: Alles auswählen

val Number nTemp = (Stall_Temp.state as QuantityType<Number>).floatValue
val Number nTempPrev = (previousState as QuantityType<Number>).floatValue
Damit war ich die Einheit endlich los :D
openHAB 2.5 (M1) in Docker auf NAS: Synology DS418play
mit Homematic, Hue, TP-Link, AVM Fritz!, FritzboxTR064, Nuki, Amazon Echo, Sonos, Harmony, zigbee2mqtt, Denon/Marantz, ...

matze.lingen
Beiträge: 52
Registriert: 28. Jul 2018 18:35
Answers: 0

Re: Rules

Beitrag von matze.lingen »

Moin zusammen,

meine Item für Luft_Wohnzimmer ist vorhanden und zwar so:

Code: Alles auswählen

String Luft_Wohnzimmer "Luftfeuchtigkeit Wohnzimmer"
Mit der If Schleife drin sieht es im Openhab Log nun so aus:

Code: Alles auswählen

2019-02-08 07:42:48.134 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'default.rules', using it anyway:
QuantityType is a raw type. References to generic type QuantityType<T> should be parameterized
2019-02-08 07:42:48.147 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'default.rules'
Hier nochmal die gesamte Rules:

Code: Alles auswählen

rule "Temp_Stal_rule"

when
    Item Stall_Temp changed

then
    logInfo("bot1", "Temperaturänderung erkannt.")
    if(Stall_Temp.state instanceof QuantityType) {
        logInfo("Temperaturstatus ist vom Typ QuantityType.") //ist das nicht der Fall, wird auch nichts ausgeführt
//      val Number nTemp = Stall_Temp.state as QuantityType<Number>
//      val Number nTempPrev = previousState as QuantityType<Number>
        val Number nTemp = (Stall_Temp.state as QuantityType<Number>).floatValue
        val Number nTempPrev = (previousState as QuantityType<Number>).floatValue


        logInfo("bot1", "Neuer Wert: " + nTemp)
        logInfo("bot1", "Letzter Wert: " + nTempPrev)

        if(nTemp <= 0 && nTempPrev > 0) {
           logInfo("bot1", "Temperatur unter 0")
           sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -5 && nTempPrev > -5) {
           logInfo("bot1", "Temperatur unter -5")
           sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
        }

        if(nTemp <= -10 && nTempPrev > -10) {
           logInfo("bot1", "Temperatur unter -10")
           sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
        }

    }
end

rule "Stall_Ausfall"
when
    Time cron "55/0 0/1 * 1/1 * ? *" // alle 50 sec
then
    if(Stall_Temp.changedSince(now.minusHours(12)) == false) {
    sendTelegram("bot2", "Stall: Temperatursensor prüfen")
    }
end
Die untere Funktioniert.

Gruß
Matze

Antworten