Seite 3 von 4

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 9. Okt 2020 10:52
von udo1toni
Das wird bei jedem Ereignis geschrieben. Wenn Du einen Raspberry nutzt, kannst Du ZRAM verwenden, damit werden die Schreibzugriffe für logs in eine RAMDisk umgeleitet. WEnn das System neu gestartet wird, kümmert sich ZRAM darum, die Inhalte vor dem Neustart auf die SD-Karte zu schreiben. Damit wird Wearout verhindert. Ob das für das NAS auch funktioniert, kann ich Dir nicht sagen.

Noch eine kleine Optimierung am Code:

Code: Alles auswählen

var Timer tBathVent = null
var Boolean bBathVentOn = false

rule "Auto Badlüftung"
when
    Item BadLueftung_AutoAktiv changed
then
    if(BadLueftung_AutoAktiv.state == OFF) {
        RS_02_Schalter.sendCommand(OFF)
        tBathVent?.cancel
        tBathVent = null
        BadLueftung_Ausschaltzeit.postUpdate(now.toString)
    }
    sendPushoverMessage(pushoverBuilder("Badlüftung Automatik "+if(BadLueftung_AutoAktiv.state != ON) "aus" else "ein" + "geschaltet"))
end

rule "Lüftung EIN / AUS"                                // Badlüftung automatisch aktiviert
when
    Item RS_01_SensorTemperature changed or             // Temperaturwechsel oder
    Item RS_01_SensorRelativeHumidity changed           // Feuchtigkeitswechsel
then
    if(BadLueftung_AutoAktiv.state == OFF) return;
    val Number nSensTemp = if(RS_01_SensorTemperature.state instanceof Number)      (RS_01_SensorTemperature.state as Number).floatValue      else 0
    val Number nSensHum  = if(RS_01_SensorRelativeHumidity.state instanceof Number) (RS_01_SensorRelativeHumidity.state as Number).floatValue else 0
    val Number nLowTemp  = if(LueftungTempUntergrenze.state instanceof Number)      (LueftungTempUntergrenze.state as Number).floatValue      else 0
    val Number nLowHum   = if(LueftungFeuchtUntergrenze.state instanceof Number)    (LueftungFeuchtUntergrenze.state as Number).floatValue    else 0
    val Number nHighTemp = if(LueftungTempObergrenze.state instanceof Number)       (LueftungTempObergrenze.state as Number).floatValue       else 0
    val Number nHighHum  = if(LueftungFeuchtObergrenze.state instanceof Number)     (LueftungFeuchtObergrenze.state as Number).floatValue     else 0

    if(nSensTemp >= nHighTemp && nSensHum >= nHighHum && tBathVent === null && RS_02_Schalter.state != ON) {   // Bedingungen für Einschalten
        RS_02_Schalter.sendCommand(ON)
        bBathVentOn = true
        BadLueftung_Einschaltzeit.postUpdate(now.toString)
        sendPushoverMessage(pushoverBuilder("Bad Lüftung automatisch EIN"))
        tBathVent = createTimer(now.plusHours(4),[ |
            if(bBathVentOn) {
                RS_02_Schalter.sendCommand(OFF)
                BadLueftung_Ausschaltzeit.postUpdate(now.toString)
                sendPushoverMessage(pushoverBuilder("Bad Lüftung nach Zeit automatisch AUS"))
                bBathVentOn = false
                tBathVent.reschedule(now.plusHours(2))
             } else
                tBathVent = null
        ])
    }
    if((nSensTemp <= nLowTemp || nSensHum <= nLowHum) && RS_02_Schalter.state == ON) { // Bedingungen für Ausschalten
        RS_02_Schalter.sendCommand(OFF)
        tBathVent?.cancel
        tBathVent = null
        BadLueftung_Ausschaltzeit.postUpdate(now.toString)
        sendPushoverMessage(pushoverBuilder("Bad Lüftung nach Wert automatisch AUS"))
    }
end
Es ist nur ein Timer notwendig. Macht keinen großen Unterschied, ist aber sauberer. In der ersten Rule war ein kleiner Fehler, den Trigger betreffend.

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 9. Okt 2020 11:11
von sihui
Mclupo hat geschrieben: 9. Okt 2020 09:41 Kann es sein, dass beim Network Heal das "System Started " triggert, wenn einige z-wave Teilnehmer offline sind bzw. wenn auf dem Z-wave Stick noch ein toter Node ohne Teilnehmer liegt?
Nein (jedenfalls bei mir nicht)

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 9. Okt 2020 11:23
von udo1toni
Und weil es so schön war... Noch eine kleine Verbesserung. Damit wird die Ausführungsdauer der Rule verbessert (wir reden aber hier vom einstelligen Millisekundenbereich...)
Damit etwas klarer wird, was die Rule macht, habe ich noch ein wenig Formatoptimierung betrieben :)

Code: Alles auswählen

var Timer tBathVent = null                                                                        // Timer Badlüftung
var Boolean bBathVentOn = false                                                                   // Merker Timerfunktion

rule "Auto Badlueftung abschalten"
when
    Item BadLueftung_AutoAktiv changed
then
    if(BadLueftung_AutoAktiv.state == OFF) {                                                      // falls neuer Zustand OFF
        tBathVent?.cancel                                                                         // eventuell vorhandenen Timer stoppen
        tBathVent = null                                                                          // und löschen
        if(RS_02_Schalter.state != OFF) {                                                         // nur falls Lüfter gerade läuft
            RS_02_Schalter.sendCommand(OFF)                                                       // Ausschalten
            BadLueftung_Ausschaltzeit.postUpdate(now.toString)                                    // Ausschaltzeit posten
        }
    }
    sendPushoverMessage(pushoverBuilder("Badlüftung Automatik " +                                 // auf jeden Fall Pushmeldung senden
        if(BadLueftung_AutoAktiv.state != ON) "aus" else "ein" + "geschaltet"))                   // mit neuem Zustand
end

rule "Lüftung EIN / AUS"                                                                          // automatische Badlüftung
when
    Item RS_01_SensorTemperature changed or                                                       // Temperaturwechsel oder
    Item RS_01_SensorRelativeHumidity changed                                                     // Feuchtigkeitswechsel
then
    if(BadLueftung_AutoAktiv.state == OFF) return;
    val Number nSensTemp = if(!(RS_01_SensorTemperature.state instanceof Number)) 0               // falls kein gültiger Wert 0
                           else (RS_01_SensorTemperature.state as Number).floatValue              // sonst der Wert
    val Number nSensHum  = if(!(RS_01_SensorRelativeHumidity.state instanceof Number)) 0          // falls kein gültiger Wert 0
                           else (RS_01_SensorRelativeHumidity.state as Number).floatValue         // sonst der Wert
    if(RS_02_Schalter.state != ON) {                                                              // eventuell einschalten
        val Number nHighTemp = if(!(LueftungTempObergrenze.state instanceof Number)) 0            // falls kein gültiger Wert 0
                               else (LueftungTempObergrenze.state as Number).floatValue           // sonst der Wert
        val Number nHighHum  = if(!(LueftungFeuchtObergrenze.state instanceof Number)) 0          // falls kein gültiger Wert 0
                               else (LueftungFeuchtObergrenze.state as Number).floatValue         // sonst der Wert
        if(nSensTemp >= nHighTemp && nSensHum >= nHighHum && tBathVent === null) {                // Bedingungen für Einschalten
            RS_02_Schalter.sendCommand(ON)                                                        // Einschalten
            bBathVentOn = true                                                                    // Merker setzen
            BadLueftung_Einschaltzeit.postUpdate(now.toString)                                    // Einschaltzeit posten
            sendPushoverMessage(pushoverBuilder("Bad Lüftung automatisch EIN"))                   // Pushmeldung
            tBathVent = createTimer(now.plusHours(4),[ |                                          // Ausschaltttimer starten
                if(bBathVentOn) {                                                                 // FallsMerker gesetzt
                    RS_02_Schalter.sendCommand(OFF)                                               // Ausschalten
                    BadLueftung_Ausschaltzeit.postUpdate(now.toString)                            // Ausschaltzeit posten
                    sendPushoverMessage(pushoverBuilder("Bad Lüftung nach Zeit automatisch AUS")) // Pushmeldung senden
                    bBathVentOn = false                                                           // Merker löschen
                    tBathVent.reschedule(now.plusHours(2))                                        // Und Timer erneut starten
                 } else                                                                           // falls Merker gelöscht
                    tBathVent = null                                                              // Timer löschen
            ])
        }
    } else {                                                                                      // eventuell ausschalten
        val Number nLowTemp  = if(!(LueftungTempUntergrenze.state instanceof Number)) 0           // falls kein gültiger Wert 0
                               else (LueftungTempUntergrenze.state as Number).floatValue          // sonst der Wert
        val Number nLowHum   = if(!(LueftungFeuchtUntergrenze.state instanceof Number)) 0         // falls kein gültiger Wert 0
                               else (LueftungFeuchtUntergrenze.state as Number).floatValue        // sonst der Wert
        if((nSensTemp <= nLowTemp || nSensHum <= nLowHum) && RS_02_Schalter.state == ON) {        // Bedingungen für Ausschalten
            RS_02_Schalter.sendCommand(OFF)                                                       // Ausschalten
            tBathVent?.cancel                                                                     // eventuell vorhandenen Timer stoppen
            tBathVent = null                                                                      // und löschen
            BadLueftung_Ausschaltzeit.postUpdate(now.toString)                                    // Ausschaltzeit posten
            sendPushoverMessage(pushoverBuilder("Bad Lüftung nach Wert automatisch AUS"))         // Pushmeldung senden
        }
    }
end

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 9. Okt 2020 12:01
von Mclupo
wird immer besser.
Kann man die Zeitvorgabe

Code: Alles auswählen

tBathVent.reschedule(now.plusHours(2))
durch eine Integer Variable, die aus einem Item erzeugt wird ( wegen sitemap Eingabe), ersetzen. Oder welches Format hat der Timer Parameter?

Code: Alles auswählen

tBathVent.reschedule(now.plusHours(DwellTime))

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 9. Okt 2020 12:11
von udo1toni
Ja, das ist kein Problem. Zu beachten ist lediglich, dass es sich tatsächlich um ein Integer handeln muss. Da Items nur vom Typ Number sein können, muss man also z.B.

Code: Alles auswählen

now.plusMinutes((TimeoutItem.state as Number).intValue)
schreiben, oder den Wert vorher (in gleicher Form wie bei den anderen Werten) in eine Integer Variable speichern; das muss aber dann innerhalb des Timers passieren, in dem der reschedule stattfindet!

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 13. Okt 2020 13:05
von Mclupo
ich habe die Heal Time auf 10.00 Uhr gesetzt und das Setzten der Variablen nur bei einem echten Neustart freigegeben.

Code: Alles auswählen

rule "System starten"
when 
    System started
then 
    SystemStartTriggerZeit.postUpdate(now.toString) 
    logInfo("sstarted","Rule getriggert")
    sendPushoverMessage(pushoverBuilder("System Start getriggert")) 
    
    if ( SystemInitialisiert.state == ON) return; 
    
    logInfo("sstarted","und initialisiert") 
    sendPushoverMessage(pushoverBuilder("und initialisiert")) 
    SystemStartZeit.postUpdate(now.toString) 
    BadLueftung_AutoAktiv.postUpdate(ON)
    Lueftung_Pause.postUpdate(180)
    Lueftung_Aktiv.postUpdate(240)
    LueftungTempObergrenze.postUpdate(25)
    LueftungTempUntergrenze.postUpdate(24)
    LueftungFeuchtObergrenze.postUpdate(50)
    LueftungFeuchtUntergrenze.postUpdate(40)

    NachrichtAktiv.postUpdate(ON)
    Zustand_Urlaub.postUpdate(OFF)

    SystemInitialisiert.postUpdate(ON)
end 
Öfter kommt nach dem Network heal die Rule " System startet"

Code: Alles auswählen

2020-10-13 10:51:45.595 [vent.ItemStateChangedEvent] - RS_01_SensorRelativeHumidity changed from 40 to 39
2020-10-13 10:52:26.059 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node11' has been updated.
2020-10-13 10:52:26.069 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node10' has been updated.
2020-10-13 10:52:33.292 [vent.ItemStateChangedEvent] - SystemStartTriggerZeit changed from 2020-10-12T18:28:09.782+0200 to 2020-10-13T10:52:33.290+0200
2020-10-13 10:52:45.266 [vent.ItemStateChangedEvent] - RS_01_SensorTemperature changed from 24.9 °C to 24.8 °C
2020-10-13 10:53:05.506 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node11' has been updated.
2020-10-13 10:53:06.396 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node38' has been updated.
2020-10-13 10:53:06.404 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node10' has been updated.
2020-10-13 10:53:06.407 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node12' has been updated.
2020-10-13 10:53:13.614 [vent.ItemStateChangedEvent] - SystemStartTriggerZeit changed from 2020-10-13T10:52:33.290+0200 to 2020-10-13T10:53:13.612+0200
2020-10-13 10:53:46.210 [vent.ItemStateChangedEvent] - RS_01_SensorTemperature changed from 24.8 °C to 24.9 °C
2020-10-13 10:53:46.785 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node38' has been updated.
2020-10-13 10:53:48.402 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node12' has been updated.
2020-10-13 10:53:48.406 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node26' has been updated.
2020-10-13 10:53:49.705 [me.event.ThingUpdatedEvent] - Thing 'zwave:device:c1f5cb4f:node26' has been updated.
2020-10-13 10:54:45.285 [vent.ItemStateChangedEvent] - RS_01_SensorTemperature changed from 24.9 °C to 24.8 °C
2020-10-13 10:55:12.618 [vent.ItemStateChangedEvent] - SD_02_Spannung changed from 233.883 to 233.703

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 14. Okt 2020 08:54
von sihui
Mclupo hat geschrieben: 13. Okt 2020 13:05 Öfter kommt nach dem Network heal die Rule " System startet"
Ich habe bei mir mal die Einträge meiner System started Rule mit dem Zwave NIghtly Heal verglichen: es besteht keinerlei Zusammenhang.

Hast du schon mal den Cache und die Temp Dateien gelöscht?

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 14. Okt 2020 15:26
von Mclupo
wo/wie mach ich das?

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 15. Okt 2020 08:17
von sihui
Mclupo hat geschrieben: 14. Okt 2020 15:26 wo/wie mach ich das?
https://community.openhab.org/t/clear-the-cache/36424

Re: Thing update jede Nacht 02.22 Uhr

Verfasst: 18. Okt 2020 20:23
von Mclupo
Ich habe unter dem Forums Punkt leider keine Angaben zu entsprechenden Files für Openhab auf dem Synology NAS gefunden.
Aber auch das Löschen der Inhalte von /volume1/Smarthome/openHAB/userdata/tmp und /cache hat nichts kaputt gemacht aber auch nichts bewirkt. Es wird weiter lustig nach dem Network Heal ein "System started" getriggert.
(korrigiert, nicht logs sondern tmp gelöscht 19.10.20 -10.0Uhr)

Code: Alles auswählen

2020-10-17 19:01:20.881 [INFO ] [ipse.smarthome.model.script.sstarted] - Rule getriggert
2020-10-17 19:01:29.371 [INFO ] [ipse.smarthome.model.script.sstarted] - Rule getriggert
2020-10-18 18:46:28.826 [INFO ] [ipse.smarthome.model.script.sstarted] - Rule getriggert