FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: schwabenuwe2103 am 11 November 2018, 13:31:51

Titel: Gelöst: An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: schwabenuwe2103 am 11 November 2018, 13:31:51
In der FHEM Tutorial Reihe gibt es einen sehr schönen Vorschlag von Matthias Kleine, der zeigt, wie man mit Hilfe eines Bluetooth Tags eine An-/Abwesenheit in FHEM erkennen kann. Die Anleitung, die ich verwendet habe, findet man hier: https://haus-automatisierung.com/hardware/fhem/2016/08/02/fhem-tutorial-reihe-part-15-anwesenheit-mit-bluetooth-le-tag-ermitteln.html# (https://haus-automatisierung.com/hardware/fhem/2016/08/02/fhem-tutorial-reihe-part-15-anwesenheit-mit-bluetooth-le-tag-ermitteln.html#)

In FHEM habe ich nun folgenden Device angelegt:

define BluetoothAnwesend PRESENCE function {`sudo /opt/fhem/lescan.sh 7C:2F:80:C4:6A:8D`}

Die Funktion startet ein Skript und scannt, ob die bekannte Bluetooth IP da ist, oder nicht und liefert dann ein "present" oder "absent" zurück. Das klappt prima.

Frage, wie kann ich das Ergebnis der Abfrage in ein DOIF einbauen, das ich für die Lichtsteuerung verwende? Ich frage in meinem DOIF verschiedene Parameter ab (z.B. Helligkeit aussen, Uhrzeit....) und wenn all diese Bedingungen erfüllt sind, läuft die Lichtsteuerung los.

Das sieht folgendermassen aus:

([?16:00-23:00] and [Helligkeit.Aussen:state:d] < 500 and [Anwesenheitssimulation] eq "ja")({fhem 'set Anwesenheitssimulator.Lampensteuerung on-for-timer '.int((rand(120))*60+120*60)})

Grundsätzlich kann ich die Abwesenheitssimulation über einen Schalter in FHEM aktivieren, oder deaktivieren. Das ist oben die Abfrage [Anwesenheitssimulation] eq "ja"

Wäre es richtig folgende zusätzliche Abfrage in die o.g. Bedingung einzubauen: [BluetoothAnwesend] eq "absent"

Um sicherzustellen, dass die Lichtsimulation dynamisch auf An-/Abwesenheit reagiert, müßte der o.g. Check ja regelmäßig durchlaufen werden. Also immer wieder prüfen, ob die Uhrzeit, die Helligkeit paßt und der Bluetooth Tag noch abwesend ist. Falls der Tag "zu Hause" ist, müßte die Lichtsimulation stoppen und erst wieder weiterlaufen, wenn der Bluetooth Tag abwesend ist. Wenn ich den DOIF richtig verstanden habe, sollte das damit möglich sein.

Habe schon verschiedene Varianten probiert, aber komme irgendwie nicht zum Ziel. Würde mich deshalb sehr über einen Tipp freuen.


Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: Ellert am 11 November 2018, 13:57:39
ZitatWäre es richtig folgende zusätzliche Abfrage in die o.g. Bedingung einzubauen
Ja.
Was hast Du schon probiert?
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: schwabenuwe2103 am 11 November 2018, 15:24:58
Variante 1: Ich habe versucht es direkt an den "Schalter" zu koppeln, der die Lichtsimulation an/aus schaltet:

[BluetoothAnwesend] eq "present") (set Anwesenheitssimulation nein) DOELSE (set Anwesenheitssimulation ja)

Variante 2: Da habe ich es direkt in den DOIF als zusätzliche Abfrage eingebaut:

([?16:00-23:00] and [Helligkeit.Aussen:state:d] < 500 and [Anwesenheitssimulation] eq "ja") and [BluetoothAnwesend] eq "nein" ({fhem 'set Anwesenheitssimulator.Lampensteuerung on-for-timer '.int((rand(120))*60+120*60)})
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: Ellert am 11 November 2018, 16:53:49
Im 2. Versuch könntest Du im DOELSE-Zweig den on-for-timer beenden.
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: schwabenuwe2103 am 11 November 2018, 19:50:52
Müßte das dann so aussehen?


([?16:00-23:00] and [Helligkeit.Aussen:state:d] < 500 and [Anwesenheitssimulation] eq "ja") and [BluetoothAnwesend] eq "nein" ({fhem 'set Anwesenheitssimulator.Lampensteuerung on-for-timer '.int((rand(120))*60+120*60)})

DOELSE

({fhem 'set Anwesenheitssimulator.Lampensteuerung off-for-timer '.int((rand(120))*60+120*60)})


Oder im DOELSE Zweig einfach:


DOELSE

({fhem 'set Anwesenheitssimulator.Lampensteuerung off-for-timer ')})


Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: Ellert am 11 November 2018, 22:36:31
Es spricht nichts dagegen es auszuprobieren.

Wie der Timer ausgeschaltet werden kann findest Du in der Befehlsreferenz unter set (extensions).
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: amenomade am 11 November 2018, 22:48:57
Im DOELSE würde ich nur "set xxx off" einbauen. Was soll sonst am Ende des "off-for-timer" passieren?
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: schwabenuwe2103 am 12 November 2018, 11:00:46
Wäre es dann folgendermassen richtig?

DOELSE

({fhem 'set Anwesenheitssimulator.Lampensteuerung off'})


Ist die Syntax auch bezüglich Hochkommata und Klammersetzung korrekt?
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: Damian am 12 November 2018, 11:10:38
Zitat von: schwabenuwe2103 am 12 November 2018, 11:00:46
Wäre es dann folgendermassen richtig?

DOELSE

({fhem 'set Anwesenheitssimulator.Lampensteuerung off'})


Ist die Syntax auch bezüglich Hochkommata und Klammersetzung korrekt?

warum nicht, entspricht übrigens:

DOELSE
{fhem 'set Anwesenheitssimulator.Lampensteuerung off'}


oder

DOELSE
(set Anwesenheitssimulator.Lampensteuerung off)
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: schwabenuwe2103 am 12 November 2018, 16:57:09
Hab ich jetzt, wie vorgeschlagen umgesetzt, hat aber einen gravierenden Nachteil  ???. Der DOELSE Zweig wird immer dann durchlaufen, wenn eine der Bedingungen nicht erfüllt ist. Beispiel: Ich bin zu Hause (und somit der Bluetooth Tag auch). Anwesenheitssimulator.Lampensteuerung wird auf "off" gesetzt. Dies passiert dann natürlich auch, wenn ich manuell das Licht angeschalten habe. Das heisst das permanente generelle Ausschalten der Lichtsteuerung im DOELSE Zweig übersteuert das manuelle Einschalten der Lichter.
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: schwabenuwe2103 am 12 November 2018, 18:39:12
Eventuell geht es doch besser über die Variante 1, die ich schon mal angedacht hatte? Also ein DOIF anlegen und auf den Bluetooth Tag abfragen und dann den Schalter ("Anwesenheitssimulation"), der die Lichtsimulation ein-/ausschaltet,  entsprechend setzen.

[BluetoothAnwesend] eq "present") (set Anwesenheitssimulation nein) DOELSE (set Anwesenheitssimulation ja)

Was meint ihr? Bezüglich der Syntax bin ich unsicher.
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: amenomade am 12 November 2018, 18:47:06
Zitat von: schwabenuwe2103 am 12 November 2018, 16:57:09
Hab ich jetzt, wie vorgeschlagen umgesetzt, hat aber einen gravierenden Nachteil  ???. Der DOELSE Zweig wird immer dann durchlaufen, wenn eine der Bedingungen nicht erfüllt ist. Beispiel: Ich bin zu Hause (und somit der Bluetooth Tag auch). Anwesenheitssimulator.Lampensteuerung wird auf "off" gesetzt. Dies passiert dann natürlich auch, wenn ich manuell das Licht angeschalten habe. Das heisst das permanente generelle Ausschalten der Lichtsteuerung im DOELSE Zweig übersteuert das manuelle Einschalten der Lichter.
Da ist aber off-for-timer nicht die Lösung. Nach dem Timer hast Du immer noch das Problem, dass es ausgeschaltet wird. Du musst besser überlegen, was genau triggern muss, was zu "on" und was zu "off" führen muss.
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: Ellert am 12 November 2018, 19:14:01
Zitat von: schwabenuwe2103 am 12 November 2018, 16:57:09
Hab ich jetzt, wie vorgeschlagen umgesetzt, hat aber einen gravierenden Nachteil  ???. Der DOELSE Zweig wird immer dann durchlaufen, wenn eine der Bedingungen nicht erfüllt ist. Beispiel: Ich bin zu Hause (und somit der Bluetooth Tag auch). Anwesenheitssimulator.Lampensteuerung wird auf "off" gesetzt. Dies passiert dann natürlich auch, wenn ich manuell das Licht angeschalten habe. Das heisst das permanente generelle Ausschalten der Lichtsteuerung im DOELSE Zweig übersteuert das manuelle Einschalten der Lichter.
Wenn Du den Timer löschst, wie in der Befehlsreferenz unter set_extensions beschrieben, könnte das Licht ggf. an bleiben.
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: schwabenuwe2103 am 12 November 2018, 22:20:57
Ich habe es jetzt im DOELSE Zweig folgendermassen probiert:
set Anwesenheitssimulator.Lampensteuerung on-for-timer 0

was laut Doku den Zeitgeber entfernt: "Um diesen Zeitgeber zu entfernen sollte man das Kommando mit dem Argument 0 erneut aufrufen."
Test läuft......
Titel: Antw:An-/Abwesenheitsstatus in DOIF abfragen
Beitrag von: schwabenuwe2103 am 14 November 2018, 06:54:51
Test war erfolgreich :). Läuft jetzt wie gewünscht. Besten Dank an alle, die bei der Lösungsfindung geholfen haben!