[Gelöst] Bewegungserkennung und Zeitabfrage in DOIF mit perl

Begonnen von mheiker, 22 September 2021, 10:18:07

Vorheriges Thema - Nächstes Thema

mheiker

Hallo zusammen,

ich verzweifel mal wieder ein wenig an einer Aufgabe, die ich umsetzen wollte.

Über einen Bewegungsmelder möchte ich in Abhängigkeit des Sonnenstandes Lichter ein- und automatisiert wieder abschalten, sobald keine Bewegung mehr erkannt wird.

Dazu habe ich mir ein DOIF gebastelt (ich weiß, ein notify wäre bestimmt schicker, aber mit dem stehe ich auf Kriegsfuss  ;)):


defmod di_bewegung_Wohnzimmer DOIF ([MQTT2_zigbee_Bewegungsmelder_Wohnzimmer:occupancy] eq "true" and\
({(hms2sec($hms)>hms2sec(ReadingsVal("Sonne","ss_indoor","20:00:00")))} or\
{(hms2sec($hms)<hms2sec(ReadingsVal("Sonne","sr","20:00:00")))}))\
(\
\
IF ({(hms2sec($hms)>hms2sec(ReadingsVal("Sonne","ss_indoor","20:00:00")))} and \
{(hms2sec($hms)<hms2sec(ReadingsVal("Sonne","ss_civil","20:00:00")))})\
(\
set MQTT2_DVES_23FCFA on,\
set Sonoff_Switch08 on,\
{fhem 'delete at_LichtWohnzimmer_01'},\
{fhem 'delete at_LichtWohnzimmer_02'},\
{fhem 'define at_LichtWohnzimmer_01 at +00:15:00 set MQTT2_DVES_23FCFA off'},\
{fhem 'define at_LichtWohnzimmer_02 at +00:20:00 set Sonoff_Switch08 off'}\
)\
\
ELSE\
(\
set MQTT2_DVES_23FCFA on,\
set Sonoff_Switch08 on,\
set LEDStripeDecke dim 65,\
{fhem 'delete at_LichtWohnzimmer_01'},\
{fhem 'delete at_LichtWohnzimmer_02'},\
{fhem 'delete at_LichtWohnzimmer_03'},\
{fhem 'define at_LichtWohnzimmer_01 at +00:15:00 set MQTT2_DVES_23FCFA off'},\
{fhem 'define at_LichtWohnzimmer_02 at +00:20:00 set Sonoff_Switch08 off'},\
{fhem 'define at_LichtWohnzimmer_03 at +00:21:00 set LEDStripeDecke dim 0 60'}\
)\
)\
\
DOELSE ()


Die Funktion hms2sec rechnet dabei eine Zeitangabe (HH:MM:SS) in Sekunden um, das klappt auch ganz gut.

Wie man vllt erkennt, lösche ich die verschiedenen at bevor ich sie neu setze. Mir ist, ehrlich gesagt, kein eleganterer Weg eingefallen, da ich nicht herausbekommen konnte, ob man ein at neu schreiben kann...aber das ist gar nicht das Problem.

Merkwürdigerweise schaltet das Licht nun immer (!), sobald der Bewegungsmelder MQTT2_zigbee_Bewegungsmelder_Wohnzimmer auf true schaltet, unabhängig von den Uhrzeiten, die ich abfrage. Fällt der Bewegungsmelder wieder auf false, werden die at auch gelöscht und erzeugt, der Teil läuft also.

Nur die Zeitvergleiche sind scheinbar funktionslos. Aber warum?
Hintergrund der Vergleiche soll sein: setzt die Dämmerung ein, werden bei Bewegung erst zwei Geräte geschaltet, wird es dunkler dann drei Geärte, was aber natürlich nur bis Sonnenaufgang passieren soll.

Kann mir jemand vllt auf die Sprünge helfen? Ich habe schon viel herumgefummelt und komme überhaupt nicht weiter...

Vielen Dank schon einmal!
Mathias

Beta-User

Ein paar Anmerkungen (zu DOIF selbst kann ich nichts sagen, da könnte "wait" ein Stichwort sein):
- die Umrechnung dürfte überflüssig sein, die Zeit-Strings müßte man auch mit "le" bzw. "gt" direkt vergleichen können;
- das sieht nach "Twilight" aus, da sollte man die Tagesphase auch über dessen "state" rausbekommen können, entsprechendes gilt für "light", wenn's nur um "duster?" geht (Abfrage, nicht trigger-Prüfung, bitte);
- defmod wäre ggf. dein Freund, und für at gibt's auch noch "modify".
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

juemuc

Hier mal ein notify als Muster  ;D

HmIP_SMI_00091A498F0907:motion:.*|HmIP_SMI_000918A9952DE7:motion:.*
IF ([HmIP_SMI_00091A498F0907:motion] eq "noMotion" and
    [HmIP_SMI_000918A9952DE7:motion] eq "noMotion")
   (sleep 3,
    set HUEDevice11 off)
ELSE
   (IF ([Bettlicht_WT_Dummy] eq "on" and
        [HmIP_SMI_00091A498F0907:brightness] < 2.5 and
        [HmIP_SMI_000918A9952DE7:brightness] < 2.5)
       (set HUEDevice11 rgb 020100 : pct 1))


Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Nobbynews

Zitat von: mheiker am 22 September 2021, 10:18:07
Wie man vllt erkennt, lösche ich die verschiedenen at bevor ich sie neu setze. Mir ist, ehrlich gesagt, kein eleganterer Weg eingefallen, da ich nicht herausbekommen konnte, ob man ein at neu schreiben kann...aber das ist gar nicht das Problem.
Trotzdem der Hinweis, probier´es mal hiermit:
https://fhem.de/commandref_DE.html#defmod

mheiker

Hallo zusammen,

super, vielen Dank für die Infos, die haben zum Ziel geführt!!!

Die Umrechnung habe ich rausgeschmissen und vergleiche die Zeitangaben direkt, funktioniert jetzt ohne Probleme. Wobei ich immer noch nicht weiß, warum es mit der Umrechnung nicht klappt...naja  ???

at wird jetzt mit demod angelegt, die delete-Zeilen sind rausgeflogen...und habe mir gemerkt: defmod statt define, sehr viel eleganter!

Besten Dank!  :D 8)

Beta-User

Danke für die Rückmeldung.
Aus https://forum.fhem.de/index.php/topic,71806.msg633579.html#msg633579

ZitatWenn das Problem gelöst ist:

       
  • Bei eurem ersten Post auf "ändern" klicken und [Gelöst] vor das Subject schreiben
  • Den Post nicht schließen - andere User wollen das Thema vielleicht aufgreifen
Ich würde es ergänzen mit: die funktionierende Lösung dann zu posten kann auch nicht schaden ;) ...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

mheiker

Alles klar!  :D

Meine Lösung sieht jetzt so aus:


defmod di_bewegung_Wohnzimmer DOIF ([MQTT2_zigbee_Bewegungsmelder_Wohnzimmer:occupancy] eq "true" and\
($hms ge [Sonne:ss_indoor] or $hms le [Sonne:sr]))\
(\
\
IF ($hms ge [Sonne:ss_indoor] and $hms le [Sonne:ss_civil])\
(\
set MQTT2_DVES_23FCFA on,\
set Sonoff_Switch08 on,\
{fhem 'defmod at_LichtWohnzimmer_01 at +00:15:00 set MQTT2_DVES_23FCFA off'},\
{fhem 'defmod at_LichtWohnzimmer_02 at +00:20:00 set Sonoff_Switch08 off'}\
)\
\
ELSE\
(\
set MQTT2_DVES_23FCFA on,\
set Sonoff_Switch08 on,\
set LEDStripeDecke dim 65,\
{fhem 'defmod at_LichtWohnzimmer_01 at +00:15:00 set MQTT2_DVES_23FCFA off'},\
{fhem 'defmod at_LichtWohnzimmer_02 at +00:20:00 set Sonoff_Switch08 off'},\
{fhem 'defmod at_LichtWohnzimmer_03 at +00:21:00 set LEDStripeDecke dim 0 60'}\
)\
)\
\
DOELSE ()

Beta-User

Thx. Die MQTT2_DEVICE-Instanzen kennen übrigens auch on-for-timer, das würde ggf. dann die ersten beiden at überflüssig machen (allerdings nicht restart-fest!), und für den 3. Timer könnte man alternativ (FHEM-) "sleep" verwenden (das ist aber auch nicht restart-fest).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

mheiker

Stimmt, danke für den Hinweis!
Ich muss mich noch daran gewöhnen, dass meine MQTT-Geräte jetzt etwas mehr können, vorher waren die über eine Xiaomi-MQTT-Definition angebunden, die war vom Umfang her etwas knapper bemessen...

Damian

DOIF ([MQTT2_zigbee_Bewegungsmelder_Wohnzimmer:occupancy] eq "true" and [[Sonne:ss_indoor]-[Sonne:ss_civil]])
(set MQTT2_DVES_23FCFA on, set Sonoff_Switch08 on)
(set MQTT2_DVES_23FCFA off)
(set Sonoff_Switch08 off)
DOELSEIF ([MQTT2_zigbee_Bewegungsmelder_Wohnzimmer:occupancy] eq "true" and [[Sonne:ss_indoor]-[Sonne:sr]])
(set MQTT2_DVES_23FCFA on, set Sonoff_Switch08 on, set LEDStripeDecke dim 65)
(set MQTT2_DVES_23FCFA off)
(set Sonoff_Switch08 off)
(set LEDStripeDecke dim 0 60)

attr wait 0,900,300:0,900,300,60


Mit Zeitintervallen, mit wait-Attribut und ohne IF und ohne AT
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF