Seite 1 von 1

OH4 - Rule aus OH2/OH3 funktioniert nicht mehr

Verfasst: 5. Dez 2024 22:13
von OSS20
Liebes openHAB Forum,

ich bin openHAB User seit 1.8 und war immer stiller Mitleser bzw. Anwender der verschiedenen Lösungen die hier und auf anderen Kanälen angeboten wurden.

Ich hatte immer einen Mix aus Tipps von Seppy, Cyrelian, udo1toni, rIkoshak, stormi, etc. und bin damit gut gefahren.

Aktuell bin ich auf:
RasPi 5
OpenHabian 4.2.3

Seit den Anfängen benutze ich eine Präsenzerkennung aus einem Mix von Klenzl, Seppy & Cyrelian. Das hat seit Anfang ganz gut funktioniert , bis ich vor kurzem auf openHAB 4.0 gewechselt habe.Jetzt funktioniert irgendwie nix mehr.

Sitzt das Problem vor dem Rechner oder hat sich was geändert?

Ich poste hier mal meine Konfig

Items:

Code: Alles auswählen

ITEMS:
//Boris
String MOB1_WLAN        "Boris Handy - WLAN-Ping" 	        (gPraesenz)   {channel="exec:command:MOB1_WLAN:output"}
String MOB1_BT          "Boris Handy - Bluetooth" 	        (gPraesenz)   {channel="exec:command:MOB1_BT:output"}
Rule:

Code: Alles auswählen

RULE (text based):
rule "Boris ist zu Hause"
   when
      Item MOB1_WLAN changed from OFF to ON or 
      Item MOB1_BT changed from OFF to ON
   then
      postUpdate(MOB1, ON)
	  logInfo("MOB1", "MOB1 ist an")
end

rule "Boris ist nicht mehr Zuhause"
   when
      Item MOB1_WLAN changed from ON to OFF or
      Item MOB1_BT changed from ON to OFF
   then
      if ( MOB1_WLAN.state == OFF && MOB1_BT.state == OFF ) {
         postUpdate(MOB1, OFF)
         logInfo("MOB1", "MOB1 ist aus")
      }
end
Scripts:

Code: Alles auswählen

#!/bin/bash

if [ -z "$1" ];

then
    echo "PING SCRIPT SAYS - So geht das nicht"
    exit 1;
fi

sudo ping -c1 $1 > /dev/null

if [ $? -ne 0 ];

then
        echo "OFF"
else
        echo "ON"
fi

Code: Alles auswählen

#!/bin/bash

#1=Boris, 2=B, 3=V, 4=V
case $1 in
   # Hier ist die MAC Adresse grossgeschrieben, bei MB001/2 muss sie klein sein
   1) MAC="80:XXX:5C" ;;
   2) MAC="A8:XXX:B9" ;;
   3) MAC="B0:XXX:9C" ;;
   4) MAC="A8:XXX:83" ;;
esac

if sudo /usr/bin/l2ping -c 1 $MAC &> /dev/null

   then
      echo "ON"
   else
      echo "OFF"
fi
Ecex Binding (Thing)

Code: Alles auswählen

//Präsenz
Thing exec:command:MOB1_WLAN            [command="/etc/openhab/scripts/ping.sh 192.168.XXX", interval=20, timeout=30, transform="REGEX((.*?))"]
Thing exec:command:MOB1_BT              [command="/etc/openhab/scripts/bt.sh 1", interval=20, timeout=30, transform="REGEX((.*?))"]
Whitelist:

Code: Alles auswählen

#Praesenz
/etc/openhab/scripts/ping.sh 192.168.XX
/etc/openhab/scripts/bt.sh 1
in der Hoffnung ihr könnt mir helfen.

Ich hatte in den letzten Tagen viele Log - Einträge eingebaut, Excec Binding auf Trace, etc.

Die Versuche bringen mich zu der Annahme, dass ich ein Problem mit dem if-Clause habe. Ich laufe dort einfach nicht rein - Ausführen der Scripts auf der Konsole bringen ordentliche Ergebnisse ...

Ich danke Euch schon mal im Voraus

Vorweihnachtliche Grüße
Boris

Re: OH4 - Rule aus OH2/OH3 funktioniert nicht mehr

Verfasst: 5. Dez 2024 22:16
von OSS20
.. und falls es nicht klar rauskommt! Der Switch schaltet nicht auf OFF - ich laufe nicht in den if-Zweig bei 2 x OFF

Re: OH4 - Rule aus OH2/OH3 funktioniert nicht mehr

Verfasst: 6. Dez 2024 11:53
von udo1toni
Sagen wir mal so... heute sollte ein Gutteil wesentlich einfacher zu erledigen sein. :)
Allerdings bin ich gerade auf dem Sprung, deshalb muss ich Dich auf später vertrösten...

Re: OH4 - Rule aus OH2/OH3 funktioniert nicht mehr

Verfasst: 7. Dez 2024 10:03
von OSS20
Na dann warte ich gerne einfach mal ab :)

Re: OH4 - Rule aus OH2/OH3 funktioniert nicht mehr

Verfasst: 7. Dez 2024 12:06
von udo1toni
Aaaalso :)

Es gibt "schon ewig" das Network Binding, welches zwei wesentliche Funktionen bietet, nämlich Ping und WOL. Du legst die Geräte an und trägst die IP (und wenn Du WOL nutzen willst, zusätzlich MAC) ein. Außerdem gibst Du einen Timeout an.
Das Thing sorgt dann dafür, dass openHAB regelmäßig ein Ping an das Gerät schickt. Falls das Gerät nicht innerhalb des Timeout antwortet, wird es als OFFLINE gemeldet. Außerdem gibt es dann noch einen Zeitstempel, wann das Gerät zuletzt ONLINE war.
Das Network Binding beherrscht dabei zwei unterschiedliche Ping-Verfahren und kann außerdem Pings auch auf unterschiedlichen Ports versenden - es gibt Geräte, die auf ICMP Pings nicht korrekt antworten, aber z.B. ein ACK auf eine http Anfrage senden.
Für Bluetooth gibt es die Funktionalität zumindest nicht in der Form, aber evtl. geht da dennoch was, das müsste man sich genauer anschauen. Aber es hindert Dich keiner, diesen Teil weiterhin über exec zu nutzen :)

Der zweite Punkt wäre, dass Du Switch Items verwenden solltest - auch mit der bisherigen Lösung hätte das funktionieren sollen (zumindest wenn das Script, wie im Code zu sehen, entweder ON oder OFF als String liefert. Ja, das Exec Binding liefert immer String zurück, aber man kann den String Channel dennoch mit Switch oder auch Number Items koppeln. Solange der gelieferte Wert als Status darstellbar ist, wird openHAB das automatisch anpassen.
Und wo wir schon bei Items sind, wäre es naheliegend, die Items zu gruppieren und das zugehörige Group Item etwa so zu definieren:

Code: Alles auswählen

Group:Switch:OR(ON,OFF) gBorisOnline
Wenn die beiden Items OFF sind, ist auch das Group Item OFF, wenn mindestens eines der beiden Items ON ist, ist auch das Group Item ON.

Mit dem Group Item reduzieren sich die Rules auf folgendes:

Code: Alles auswählen

rule "Boris Anwesenheit"
when
    Item gBorisOnline changed
then
    MOB1.postUpdate(newState.toString)
    logInfo("mob1","MOB1 ist a{}",if(newState == ON) "n" else "us")
end
Natürlich kannst Du an dieser Stelle auch die Definition von MOB1 anpassen, so dass es die Rolle des Group Items gBorisOnline übernimmt :) der Wert ist ja eh der gleiche - dann entfällt das zusätzliche Item und die Rule reduziert sich auf den logInfo-Befehl, die Rule könnte dann also vermutlich komplett entfallen...

Wie Du sehen kannst, kümmert sich die Rule um beide Zustände, ON wie OFF, warum sollte man hier zwei Rules schreiben?

Der logInfo Befehl bedarf eventuell noch etwas Erläuterung.
Innerhalb des log-Strings werden geschweifte Klammerpaare {} durch den jeweils nächsten Wert der kommaseparierten Liste ersetzt, hier also das Ergebnis der Funktion

Code: Alles auswählen

if(newState == ON) "n" else "us"
Dieses Konstrukt heißt ternärer Operator, ist die if-Bedingung erfüllt, so wird der erste Wert geliefert, sonst der zweite Wert (also n oder us, was zusammen mit dem fixen String vor den {} also "an" bzw. "aus" ergibt. Ich bin ein Spielkind...

Re: OH4 - Rule aus OH2/OH3 funktioniert nicht mehr

Verfasst: 7. Dez 2024 12:40
von OSS20
Hallo Udo,

vielen Dank für die ausführliche Info und die Tipps. Das Network Binding werde ich auf jeden Fall ausprobieren. Den Rest schaue ich mir an, muss ich erst mal verstehen :) ich sehe aber jetzt schon, dass meine Rule für 4 Familienmitglieder mit Deinem Code ziemlich schrumpfen wird :D Wird ein wenig dauern, das umzubauen, ich melde mich aber auf jeden Fall zurück.

Jetzt erst mal viele Grüße & schönes Wochenende
Boris

Re: OH4 - Rule aus OH2/OH3 funktioniert nicht mehr

Verfasst: 7. Dez 2024 22:11
von udo1toni
Wenn mehrere Geräte abgefragt werden sollen, kannst Du eine weitere Gruppe oberhalb der Gruppen anlegen. Auch diese Gruppe kann - genau wie die zum Zusammenfassen von Bluetooth und WLAN - verodern und damit ohne eine einzige Codezeile An-/Abwesenheit aller Bewohner melden.