Gelöst: An-/Abwesenheitsstatus in DOIF abfragen

Begonnen von schwabenuwe2103, 11 November 2018, 13:31:51

Vorheriges Thema - Nächstes Thema

schwabenuwe2103

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#

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.



Ellert

ZitatWäre es richtig folgende zusätzliche Abfrage in die o.g. Bedingung einzubauen
Ja.
Was hast Du schon probiert?

schwabenuwe2103

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)})

Ellert

Im 2. Versuch könntest Du im DOELSE-Zweig den on-for-timer beenden.

schwabenuwe2103

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 ')})



Ellert

Es spricht nichts dagegen es auszuprobieren.

Wie der Timer ausgeschaltet werden kann findest Du in der Befehlsreferenz unter set (extensions).

amenomade

Im DOELSE würde ich nur "set xxx off" einbauen. Was soll sonst am Ende des "off-for-timer" passieren?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

schwabenuwe2103

Wäre es dann folgendermassen richtig?

DOELSE

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


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

Damian

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)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwabenuwe2103

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.

schwabenuwe2103

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.

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Ellert

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.

schwabenuwe2103

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......

schwabenuwe2103

Test war erfolgreich :). Läuft jetzt wie gewünscht. Besten Dank an alle, die bei der Lösungsfindung geholfen haben!