Rules fuer Entfernung meines Fahrzeuges

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Sadi191
Beiträge: 30
Registriert: 3. Mär 2021 20:01
Answers: 0

Rules fuer Entfernung meines Fahrzeuges

Beitrag von Sadi191 »

Hallo Zusammen,

ich benoetige mal wieder Eure Hilfe.
Ich moechte gern eine Telegramm Nachricht erhalten, immer dann wenn das Fahrzeug sich entfernt (groesser 1000m) und wenn es nach Hause kommt (kleiner 1000m).

Dafuer habe ich bereits Telegramm und das BMW - Binding eingerichtet.

Telegramm:

Code: Alles auswählen

Thing telegram:telegramBot:XXX               "00_API_Telegram"            [ chatIds="ZZZ", botToken="XXX:YYY" ]
BMW:

Code: Alles auswählen

String                BMW_220d_Adresse                  "BMW_220d_Adresse"                      {channel="mybmw:conv:XXX:220d:location#address" }
Number:Length         BMW_220d_Entfernung_von_Zuhause   "BMW_220d_Entfernung_von_Zuhause"       {channel="mybmw:conv:XXX:220d:location#home-distance"}                       
Die Entfernung des Fahrzeuge wird mir schon korrekt im Item ausgegeben.

Koennt Ihr mir nun noch bei der Rule helfen?

Ich nutze Openhab 4.2.2 und VS Code.
openHAB 4.2.2 / Raspi 4

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Rules fuer Entfernung meines Fahrzeuges

Beitrag von nw378 »

ok, probieren wir es mal.

damit du nicht ständig Nachrichten bekommst, wenn das Fzg. sich weiter dem Haus nähert (oder entfernt), also bei jeder Positionsänderung(!!), benötigst Du zusätzlich einen Schalter.
Z. B. eine globale Variable.

Code: Alles auswählen

var boolean bBMWzuhause=true

rule "Position PKW geändert"
when 
    Item BMW_220d_Entfernung_von_Zuhause changed // Position hat sich geändert
then
    var nachricht="" //init
    switch newState { 
      case newState < 1000|m : { if bBMWzuhause // Fzg ist schon im Nahbereich, Nachricht bereits gesendet
                                   return;      // Abbruch
                                 bBMWzuhause=true // Schalter für "zuhause" setzen
                                 nachricht="BMW nähert sich dem Haus" 
                                 }
      case newState > 1000|m : { if (!bBMWzuhause) // Fzg ist schon weiter weg, Nachricht bereits gesendet
                                   return;         //Abbruch
                                 bBMWzuhause=false //Schalter für "zuhause" setzen
                                 nachricht="BMW ist weg" 
                                 }             
  }                                               
  val telegramAction = getActions("telegram","telegram:telegramBot:<uid>")                                   
  telegramAction.sendTelegram(nachricht)
end

Nur grob runtergeschrieben, nicht getestet.

Bei der Initiierung (var bBMW...) gehe ich mal davon aus, dass es dein Fzg. ist und du zuhause bist.

Alternativ kannst Du auch ein Switch-Item nehmen, und den z.B. persistieren (falls OH mal ausfallen sollte).

Ob das mit dem Telegram so stimmt, weiß ich nicht, benutze ich nicht. Ich gehe aber mal davon aus, dass Du auch in anderen Regeln Telegramme sendest und das ggf. anpassen kannst.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

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

Re: Rules fuer Entfernung meines Fahrzeuges

Beitrag von udo1toni »

Es braucht dazu nicht unbedingt eine extra Variable :)

Code: Alles auswählen

rule "Position PKW geändert"
when 
    Item BMW_220d_Entfernung_von_Zuhause changed              // Position geändert
then
    var String strMessage = ""                                // Variable definieren
    if(newState < 1|km && previousState >= 1|km) {            // neuer Wert unter 1 km, alter Wert über 1 km
        strMessage = "BMW kommt an"
    }
    if(newState > 1|km && previousState <= 1|km) {            // neuer Wert über 1 km, alter Wert unter 1 km
        strMessage = "BMW fährt weg"
    }
    if(strMessage == "") {                                    // keine Meldung vorhanden
        logDebug("distance","KEINE Meldung (Änderung von {} zu {})",previousState,newState)
        return;
    }
    logDebug("distance","Meldung: {} (Änderung von {} zu {})",strMessage,previousState,newState)
    val telegramAction = getActions("telegram","telegram:telegramBot:<uid>")
    telegramAction.sendTelegram(strMessage)
    }
end
Im großen und Ganzen macht der Code das gleiche :) wie gesagt ohne extra Variable. In Rules, die mit changed getriggert wurden, gibt es zwei implizite Variablen, previousState und newState, die, wie der Name schon nahelegt, den alten sowie den neuen Status enthalten.
Wenn das Item BMW_220d_Entfernung_von_Zuhause vom Typ Number:Length ist, so kann man bequem mit QuantityType arbeiten, also statt 1000|m auch 1|km schreiben.
Die Logzeile wird nur ausgegeben, wenn der Logger org.openhab.core.model.script.distance auf DEBUG gesetzt wird.
Die Logzeilen sind bei der Fehlersuche hilfreich, man kann sie natürlich auch weg lassen :)

Die Rule setzt stillschweigend voraus, dass sowohl der alte als auch der neue Status ein gültiger QuantityType Wert ist.
Bei der ersten Änderung nach einem Neustart kann es deshalb eine Fehlermeldung geben, weil eben einer der beiden Werte ungültig ist, genauso kann der Sensor (also der mit dem Item verknüpfte Channel, der die Entfernung vom Standort liefert) das Item auf einen ungültigen Wert setzen.
Beide Situationen kann man abfangen, z.B. so:

Code: Alles auswählen

if(!(newState instanceof QuantityType<Length>)) {// Fehlermeldung}
Die Frage ist allerdings, was dann passieren soll :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Sadi191
Beiträge: 30
Registriert: 3. Mär 2021 20:01
Answers: 0

Re: Rules fuer Entfernung meines Fahrzeuges

Beitrag von Sadi191 »

Das hat super geklappt. Ich danke Euch!
openHAB 4.2.2 / Raspi 4

Antworten