Seite 3 von 3

Re: [Rule] Heizung steuern bei Änderung des Fenstersensors

Verfasst: 6. Sep 2022 22:32
von Eleven
Nabend,

ich habe das gerade mal so wie Du es beschrieben hast eingerichtet. Als erstes habe ich ein item für den benötigten Zeitstempel angelegt.

items:

Code: Alles auswählen

Number                  BDO_Heizung_SetTemp                 "Solltemperatur [%.1f °C]" 
DateTime                BDO_Zeitstempel                     "offene Zeit" 
Anschließend habe ich in den jeweiligen Persistenzen die nötigen Einträge gemacht.
mapdb.persist:

Code: Alles auswählen

Strategies {
  default = everyUpdate
}

Items {
  BDO_Zeitstempel : strategy = everyChange, restoreOnStartup
}
rrd4j.persist:

Code: Alles auswählen

Strategies {
        everyMinute : "0 * * * * ?"
        default = everyChange

}
Items {
        BDO_Heizung_SetTemp : strategy = everyUpdate, everyMinute     
}
Danach habe ich die vorhandene rule mit Deiner Erläuterung mal versucht umzubauen:
fensteroffen.rules

Code: Alles auswählen

// vordefinierte Temperaturen
val Number tempOff = 8.0

// Timervariable definieren
var Timer fenstertimer = null    


// Rule Fenster offen für das Badezimmer oben
rule "Heizung Bad oben"
when
    Item BDO_Fenster_Status changed                             
then
    val actions = getActions("pushover", "pushover:pushover-account:pushover")
        if(BDO_Fenster_Status.state != CLOSED) {                    
            BDO_Zeitstempel.postUpdate(new DateTimeType(now.minusSeconds(1)))
            BDO_Heizung_SetTemp.sendCommand(tempOff)  
            logInfo("Heizung", "Fenster im Bad oben geöffnet und Heizkörper abgedreht")
            fenstertimer = createTimer(now.plusMinutes(10), [|      
                fenstertimer = null 
            ])                                                      
        } else {                                                    
            BDO_Heizung_SetTemp.sendCommand(BDO_Heizung_SetTemp.historicState((BDO_Zeitstempel.state as DateTimeType).getZonedDateTime()))
            BDO_Zeitstempel.postUpdate(new DateTimeType(now.plusSeconds(1)))
            logInfo("Heizung", "Fenster im Bad oben geschlossen und Heizkörper aufgedreht")
            actions.sendHtmlMessage("Pushover", "Fenster im Bad oben geschlossen und Heizkörper aufgedreht")
            if(fenstertimer !== null) {                             
                fenstertimer.cancel                                 
                fenstertimer = null 
            }
        }
end
Im VS-Code wird mir vorab schon bei der Zeile:

Code: Alles auswählen

BDO_Heizung_SetTemp.sendCommand(BDO_Heizung_SetTemp.historicState((BDO_Zeitstempel.state as DateTimeType).getZonedDateTime()))
als Fehlermeldung: "Type mismatch: cannot convert from HistoricItem to Command"

Trotzdem habe ich mal die Funktion überprüft und den log beobachtet. Beim öffnen des Fensters funktioniert alles wie gewünscht. Die Temperatur wird abgesenkt, der Zeitstempel wird gesetzt. Beim öffnen jedoch erhalte ich eine Fehlermeldung. Die Temperatur bleibt abgesenkt.

Code: Alles auswählen

2022-09-06 22:26:43.057 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Fenster_Status' changed from CLOSED to OPEN
2022-09-06 22:26:43.082 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'BDO_Heizung_SetTemp' received command 8.0
2022-09-06 22:26:43.086 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Zeitstempel' changed from 2022-09-06T22:11:06.830649+0200 to 2022-09-06T22:26:42.058248+0200
2022-09-06 22:26:43.095 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'BDO_Heizung_SetTemp' predicted to become 8.0
2022-09-06 22:26:43.117 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Heizung_SetTemp' changed from 10 to 8.0
2022-09-06 22:26:55.375 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'fensteroffen-1' failed: An error occurred during the script execution: Could not invoke method: org.openhab.core.model.script.actions.BusEvent.sendCommand(org.openhab.core.items.Item,org.openhab.core.types.Command) on instance: null in fensteroffen
==> /var/log/openhab/events.log <==
2022-09-06 22:26:55.363 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Fenster_Status' changed from OPEN to CLOSED
Hast Du noch eine Idee?

Re: [Rule] Heizung steuern bei Änderung des Fenstersensors

Verfasst: 6. Sep 2022 22:45
von Eleven
Habe jetzt nochmal versuchsweise deine anderen Vorschläge aus den vorherigen Posts ausprobiert und was soll ich sagen, es funktioniert nun.

Die vorher fehlerhafte Zeile sieht nun so aus:

Code: Alles auswählen

BDO_Heizung_SetTemp.sendCommand(BDO_Heizung_SetTemp.historicState((BDO_Zeitstempel.state as DateTimeType).getZonedDateTime()).state.toString)
Die komplette rule sieht jetzt wie folgt aus:

Code: Alles auswählen

// vordefinierte Temperaturen
val Number tempOff = 8.0

// Timervariable definieren
var Timer fenstertimer = null    


// Rule Fenster offen für das Badezimmer oben
rule "Heizung Bad oben"
when
    Item BDO_Fenster_Status changed                             
then
    val actions = getActions("pushover", "pushover:pushover-account:pushover")
        if(BDO_Fenster_Status.state != CLOSED) {                    
            BDO_Zeitstempel.postUpdate(new DateTimeType(now.minusSeconds(1)))
            BDO_Heizung_SetTemp.sendCommand(tempOff)  
            logInfo("Heizung", "Fenster im Bad oben geöffnet und Heizkörper abgedreht")
            fenstertimer = createTimer(now.plusMinutes(10), [|      
                fenstertimer = null 
            ])                                                      
        } else {                                                    
            BDO_Heizung_SetTemp.sendCommand(BDO_Heizung_SetTemp.historicState((BDO_Zeitstempel.state as DateTimeType).getZonedDateTime()).state.toString)
            BDO_Zeitstempel.postUpdate(new DateTimeType(now.plusSeconds(1)))
            logInfo("Heizung", "Fenster im Bad oben geschlossen und Heizkörper aufgedreht")
            actions.sendHtmlMessage("Pushover", "Fenster im Bad oben geschlossen und Heizkörper aufgedreht")
            if(fenstertimer !== null) {                             
                fenstertimer.cancel                                 
                fenstertimer = null 
            }
        }
end
Im log läuft es jetzt auch so durch!

Code: Alles auswählen

2022-09-06 22:40:22.865 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Fenster_Status' changed from CLOSED to OPEN
2022-09-06 22:40:22.897 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'BDO_Heizung_SetTemp' received command 8.0
2022-09-06 22:40:22.900 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Zeitstempel' changed from 2022-09-06T22:26:42.058248+0200 to 2022-09-06T22:40:21.871585+0200
2022-09-06 22:40:22.906 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'BDO_Heizung_SetTemp' predicted to become 8.0
2022-09-06 22:40:22.920 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Heizung_SetTemp' changed from 15 to 8.0
2022-09-06 22:40:31.686 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Fenster_Status' changed from OPEN to CLOSED
2022-09-06 22:40:31.707 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'BDO_Heizung_SetTemp' received command 15.0
2022-09-06 22:40:31.714 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'BDO_Heizung_SetTemp' predicted to become 15.0
2022-09-06 22:40:31.730 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Zeitstempel' changed from 2022-09-06T22:40:21.871585+0200 to 2022-09-06T22:40:32.698062+0200
2022-09-06 22:40:31.733 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BDO_Heizung_SetTemp' changed from 8 to 15.0

Vielen vielen Dank für die tolle Unterstützung!