Differenz zweier Zeiten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Jojo
Beiträge: 206
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Differenz zweier Zeiten

Beitrag von Jojo »

Servus zusammen,

ich brauche mal wieder eure Hilfe:
Ich suche schon den halben Tag und finde nichts.
Ich möchte mir mit LED´s anzeigen lassen, ob meine Temperatursensoren (ESP8266 mit Tasmota) noch aktiv sind.
Wenn die letzte Aktualisierung länger als 5 Minuten her ist soll eine rote Diode leuchten, sonst eine grüne.
Ich habe die aktuelle Zeit in der Variablen Date (aus dem ntp Binding) und die letzte Aktualisierung ihn der Variablen ZeitKeller2 (aus [profile="timestamp-update"]). Beides DateTime.
Je nach Unterschied soll eine Nachricht an einen ESP gehen der je nach Inhalt ein Relais zieht oder nicht ( ergibt grün oder rot )
Ich bekomme aber die Regel nicht hin:
wenn ZeitKeller2 + 5 min kleiner als Date dann schicke "grün" per MQTT sonst "rot".

Es wäre toll, wenn mir jemand auf die Sprünge helfen könnte !!!

Vielen Dank im Voraus
--

Gruß

Jojo

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

Re: Differenz zweier Zeiten

Beitrag von udo1toni »

Du denkst unnötig kompliziert :)

Es reicht ein spezielles Item und eine Rule. Das spezielle Item kann sogar das Item der grünen bzw. roten LED sein.
Nehmen wir an, Deine Items heißen Sensor1_Temp, Sensor1_Online und Sensor1_Offline.

Du verlinkst Sensot1_Online mit dem Expire Binding. Du stellst eine Ablaufzeit von 5 Minuten ein und definierst, dass nach Ablauf der Zeit ein sendCommand(OFF) abgesetzt wird. Nun reichen zwei Rules:

Code: Alles auswählen

rule "toggle LED red/green"
when
    Item Sensor1_Online changed
then
    Sensor1_Offline.sendCommand(previousState.toString)
end

rule "update temp"
when
    Item Sensor1_Temp received update
then
    Sensor1_Online.sendCommand(ON)
end
Sobald der Sensor einen Wert sendet, sendet die 2. Rule das Kommando ON an das Item Sensor1_Online. Falls das Item auf OFF stand, wird durch die erste Rule das Item Sensor1_Offline auf OFF gesetzt.
Kommt länger als 5 Minuten kein Update rein, so löst das expire Binding ein Kommando OFF aus. Damit erlischt die grüne LED. Die erste Rule wird durch den Statuswechsel getriggert, womit das Offline-Item den alten Status bekommt.

Noch besser wäre es natürlich, die beiden LED mit nur einem Treiber anzusteuern, so, dass entweder die eine oder die andere LED leuchtet (dazu muss der Treiber den gemeinsamen Anschluss aktiv auf + 5 Volt oder 0 Volt ziehen, der jeweils zweite Anschluss geht dann einmal auf + 5 Volt und einmal auf 0 Volt. Wichtig ist natürlich, dass die LED jeweils korrekt gepolt sind. Damit wäre dann die erste Rule obsolet.

Wenn Dir die Lösung mit dem Expire Binding nicht behagt, (immerhin wird dann unnötigerwesie immer wieder ein ON gesendet, obwohl das Item schon an ist), kannst Du auch einen einfachen Timer verwenden:

Code: Alles auswählen

var Timer tSensor = null

rule "update temp"
when
    Item Sensor1_Temp received update
then
    if(Sensor1_Online.state != ON) Sensor1_Online.sendCommand(ON)
    if(Sensor1_Offline.state != OFF )Sensor1_Offline.sendCommand(OFF)
    tSensor?.cancel
    tSensor = createTimer(now.plusMinutes(5),[|
        Sensor1_Online.sendCommand(OFF)
        Sensor1_Offline.sendCommand(ON)
    ])
end
Im Großen und Ganzen tut die Rule das gleiche. Jedoch ist es nur eine Rule, die dafür beide Items setzt. Die Items bekommen nur dann ein Kommando, wenn das Item nicht bereits korrekt gesetzt ist (natürlich nur beim Online Melden, nicht beim Offline Melden, das passiert ja nur einmalig).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Jojo
Beiträge: 206
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Re: Differenz zweier Zeiten

Beitrag von Jojo »

udo1toni hat geschrieben: 13. Apr 2021 00:46 Du denkst unnötig kompliziert :)
Also so richtig unkompliziert antwortest du auch nicht ;) :D
Mein Ausgangspunkt ist eine Karte mit 16 Relais drauf die ich irgendwann mal im Elektrokaufrausch erworben habe und nun verarbeiten möchte.
Und da dachte ich mir: Mach doch eine Anzeige. Die Relais sind sowohl NC als auch NO, da kommen die LED´s dran, eine ein und die andere aus, je nach Zustand des Output vom ESP.

Ich bevorzuge den zweiten Code von dir, vielen Dank nochmal.
In meinem komplizierten ( ;) ) Aufbau muss ich aber eine MQTT Nachricht an den ESP schicken, wo baue ich denn :

Code: Alles auswählen

val mqttActions = getActions("mqtt","mqtt:broker:JojoBroker")
                mqttActions.publishMQTT("home/Temperaturen/Keller", "rot")
                }
ein ?

Ich denke so:
Die grüne LED leuchtet.
Und nur wenn eine Zeit x kein Update kommt geht die auf rot.
Die wird von alleine dann auch nicht mehr grün, weil irgendwas nicht stimmt ( Netzteil tot, WLAN kaputt ... )

Vielen Dank auf jeden Fall !!!
--

Gruß

Jojo

StefanH.
Beiträge: 162
Registriert: 28. Dez 2017 11:37
Answers: 0

Re: Differenz zweier Zeiten

Beitrag von StefanH. »

2021-04-13_11h58_49.png
An Stelle 1 weisst du, dass Daten angekommen sind und das "alles in Ordnung" ist.
Stelle 2 wird nur erreicht, wenn keine Daten innerhalb von 5min angekommen sind. Da schickst du deinen MQTT Befehl.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Jojo
Beiträge: 206
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Re: Differenz zweier Zeiten

Beitrag von Jojo »

Servus Stefan,
danke für die Erklärung, aber mal ganz blöd gefragt:
Stelle 1 und gegebenenfalls 2 passieren NUR wenn das Item ein Update erfährt. Wenn aber das nicht passiert dann passiert auch nichts
, oder ?
--

Gruß

Jojo

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

Re: Differenz zweier Zeiten

Beitrag von udo1toni »

Du kannst natürlich direkt mqtt Messages schicken, aber die gewöhnliche Vorgehensweise ist, pro Relais ein Item zu definieren. Die Rule schaltet dann das Item, welches wiederum den MQTT Befehl sendet. Wenn Du nur ein Relais schalten musst, reicht natürlich entsprechend auch ein Item.

Wenn es partout ein direkter Befehl sein soll, geht das so:

Code: Alles auswählen

var Timer tSensor = null

rule "update temp"
when
    Item Sensor1_Temp received update
then
    val mqttActions = getActions("mqtt","mqtt:broker:JojoBroker")
    mqttActions.publishMQTT("home/Temperaturen/Keller", "gruen")
    tSensor?.cancel
    tSensor = createTimer(now.plusMinutes(5),[|
        val mqttActions = getActions("mqtt","mqtt:broker:JojoBroker")
        mqttActions.publishMQTT("home/Temperaturen/Keller", "rot")
    ])
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Jojo
Beiträge: 206
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Re: Differenz zweier Zeiten

Beitrag von Jojo »

Servus Udo,
( ist eigentlich Udo OK? )
Vielen vielen Dank.
Gerne höre ich auf dich und definiere Items, aber wie sind Item und Relais verbunden ? Dafür brauche ich dann einen Channel und je Item ein Thing, oder ? Und Tasmota auf den ESP?
--

Gruß

Jojo

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

Re: Differenz zweier Zeiten

Beitrag von udo1toni »

Ja, Udo ist ok (und korrekt)

Wenn Du Tasmota auf dem ESP hast, musst Du lediglich ein Generic MQTT Thing anlegen. Unterhalb des Thing legst Du dann 16 + x Channel an. Die 16 Channel sind für alle Relais, die x zusätzlichen Channel sind für zusätzliche Funktionen, z.B. um die WLAN Signalstärke anzuzeigen, da kommt es drauf an, was Du möchtest.

So als Grundkonfiguration sähe das so aus:

Code: Alles auswählen

UID: mqtt:topic:board
label: 16 Kanal Bord
thingTypeUID: mqtt:topic
configuration:
  payloadNotAvailable: Offline
  availabilityTopic: home/Temperaturen/LWT
  payloadAvailable: Online
channels:
  - id: ch1
    channelTypeUID: mqtt:switch
    label: Kanal 1
    description: ""
    configuration:
      commandTopic: home/Temperaturen/Keller
      stateTopic: home/Temperaturen/Keller
      off: rot
      on: gruen
  - id: ch2
    channelTypeUID: mqtt:switch
    label: Kanal 2
    description: null
    configuration:
      commandTopic: home/Temperaturen/Dach
      stateTopic: home/Temperaturen/Dach
      off: rot
      on: gruen
Die Topics sind natürlich nur Beispiele. Wenn Du das LastWillTopic im Thing setzt, wird das Thing Online oder Offline angezeigt, wenn das Board erreichbar/nicht erreichbar ist. Wichtig ist, dass Du sowohl das commandTopic als auch das stateTopic setzt (die beiden unterscheiden sich zwingend!) Mit Tasmota wären die typischen Topics cmnd/Temperaturen/POWER1 und stat/Temperaturen/POWER1, das LastWillTopic wäre dann tele/Temperaturen/LWT (jeweils angenommen, dass das Topic "Temperaturen" lautet)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Jojo
Beiträge: 206
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Re: Differenz zweier Zeiten

Beitrag von Jojo »

Servus Udo,
(ich freue mich dich korrekt anreden zu können ;-) )

Mega Dank. Ich werde ein wenig brauchen das umzusetzen aber sicher ein Ergebnis ( oder noch mehr Fragen ) posten.

Vielen Vielen Dank !!!
--

Gruß

Jojo

Jojo
Beiträge: 206
Registriert: 5. Mär 2019 21:13
Answers: 2
Wohnort: Ingolstadt

Re: Differenz zweier Zeiten

Beitrag von Jojo »

UPDATE:
IMG_3992.jpeg
Servus zusammen,
8E488D1F-FC1B-4659-B030-65E60791EFAE.jpeg
Auf der Aluplatte fehlt noch die Beschriftung, aber vom Prinzip her funktioniert es dank Udo!!!!
Ich abe den ESP mit Tasmota geflasht und 8 Relais definiert.
Geht aber nicht, D8 ist in diesem Zusammenhang nicht nutzbar, der ESP startet nicht, wenn der angeschlossen ist.
Also nur 7, dann klappt es wunderbar, auch mit dem senden eines Befehls zum umschalten.

Was nicht geht ist der Timer. Das ist für mich auch irgendwie logisch. Denn wenn kein Update kommt greift auch die Rule nicht.

Also eine Frage bleibt, und das ist die Eingangsfrage:
Ich habe in einer Variablen die Zeit der letzten Aktualisierung
Ich habe in einer anderen Variablen die aktuelle Zeit

Mein Ansatz wäre aus den beiden die Differenz zu bilden und das nach Ergebnis einen Befehl zu senden. Genaugenommen NUR wenn TDiff > 5min.
Ansonsten bleibt das Relais auf und die LED grün.
Habe ich da eine Chance ?

Gruß und Dank!!!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
--

Gruß

Jojo

Antworten