(Gelöst) Abwesenheits erkennung

Begonnen von Roli1606, 01 Februar 2014, 23:39:34

Vorheriges Thema - Nächstes Thema

Markus Bloch

Semikolons innerhalb von Perl Code müssen doppelt geschrieben werden (escaping), da sonst ab dem Semikolon ein neuer FHEM Befehl erwartet wird.

Also:

define Tuer_zu_Abwesend notify Anwesenheit:absent { my $hm == sprintf("%%02d:%%02d", $hour, $min) ;; if ($hm gt "08:00" || $hm lt "17:00") && (Value("Tuerschloss") =~ m/^unlocked/) { fhem("set Tuerschloss lock") }}
attr Tuer_zu_Abwesend room Anwesend
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Roli1606

Ich habe das direkt in eine .cfg datei geschrieben die in die fhem.cfg eingebunden ist.

Hab jetzt 2 Semikolon eingefügt und nun kommt eine andere Fehlermeldung

2014.02.11 20:49:21 3: Tuer_zu_Abwesend return value: syntax error at (eval 41) line 1, near ") &&"
syntax error at (eval 41) line 1, near "}}"

define Tuer_zu_Abwesend notify Anwesenheit:absent { my $hm == sprintf ("%%02d:%%02d", $hour, $min) ;; if ($hm gt "08:00"||$hm lt "22:00") && (Value("Tuerschloss") =~ m/^unlocked/) { fhem("set Tuerschloss lock") }}
attr Tuer_zu_Abwesend room Anwesend
Cubietruck mit Stefanius Image
FHEM 5.8
HMLAN
und CUL

SGi

#17
Hallo zusammen,

ich klinke mich mal ein, da ich ein ähnliches Problem habe. Auch ich verwende PRESENCE, was per Bluetooth tadellos den Status meiner beiden Dummys ATH_A und ATH_B setzt. Daraus folgend (oder auch unter Einbeziehung weiterer Parameter) möchte ich ein globales weiteres Dummy setzen, das den Status des Hauses als "bewohnt" oder "unbewohnt" anzeigt. Es scheitert aber schon bei den beiden Werten.

Nun habe ich schon in der cfg und auch im DEFinition-Feld anhand verschiedener Posts und Lösungswege experimentiert, mein Statusdummy verändert sich aber leider nie so wie ich das will oder aber gar nicht. Ziel ist es, bei Änderung eines der beiden ATH-Flags zu überprüfen, ob beide auf "absent" sind. Erst dann ist das Haus "unbewohnt", ansonsten immer "bewohnt". Die nachfolgende Variante erscheint mir am nachvollziehbarsten, geht aber nicht :-)

Mein notify-DEF (copy-paste) enthält folgendes:


ATH.*:absent {
  if (Value("ATH_A") eq "absent" && Value("ATH_B") eq "absent") {
    if (Value("Haus") ne "unbewohnt″) { fhem("set Haus unbewohnt") }
    else {
    if (Value("Haus") eq "unbewohnt") { fhem("set Haus bewohnt") }
    }
  }
}


Wo ist der Fehler (wahrscheinlich wieder so ein Klammerding...) ?

Cheers,

Sven


EDIT:

Habs jetzt nach mehrfachem Lesen dieses und anderer Threads auch hinbekommen, mich für die elegante Art der Struktur entschieden - und weiß mittlerweile wo mein (simpler) Fehler lag. Hier also der Hinweis, damit nicht noch jemand drauf reinfällt:

Zum Testen meiner Funktionen hatte ich  ATH_A und ATH_B als dummys definiert und solange die Zeile mit PRESENCE auskommentiert. Über eine Event-Map habe ich dann den Status auf "present" oder "absent" gesetzt (Codes auf die wesentlichen Zeilen gekürzt):


define ATH_A dummy
# define ATH_A PRESENCE local-bluetooth 12:34:56:78:90:12
attr ATH_A eventMap /on:present/off:absent/

define Haus structure Anwesenheit ATH_A ATH_B
attr Haus clientstate_behavior relative
attr Haus clientstate_priority bewohnt|present unbewohnt|absent


Alles sah in der Weboberfläche richtig aus und ich konnte die Stati per Hand schalten. Trotzdem funktionierte da aber die o.g. Struktur nicht und lieferte ein "undefined".

Offensichtlicher Grund: die Dummys lieferten trotzdem nur die Werte "on" und "off", getestet wird aber nur auf "absent" und "present", und nur darauf wird gemäß Definition auch "Haus" auf "bewohnt" oder "unbewohnt" gesetzt.

Ergänze ich aber "on" und "off" in den Werte-Gruppen der Struktur


attr Haus clientstate_priority bewohnt|present|on unbewohnt|absent|off


So funktioniert PRESENCE, und ich kann alternativ durch aktivieren der "Dummy"-Zeilen und auskommentieren von PRESENCE zum Testen auch mal händisch mit den Dummys arbeiten...


Trotzdem wieder mal danke für dieses Forum und allen fleissigen Mitstreitern...

Sven
FHEM auf RasPi und FritzBox 7390 mit MAX! und HomeMatic

Roli1606

Habe noch einige Fehler die ich nicht erkennen kann. Vielleicht erkennt ja einer was oder kann mir sagen was die Fehler Code´s bedeuten.

2014.02.11 22:33:29 3: Tuer_zu_Abwesend return value: syntax error at (eval 39) line 1, near ") &&"
syntax error at (eval 39) line 1, near "}}"

2014.02.11 22:33:29 3: Tuer_zu_Abwesend return value: syntax error at (eval 41) line 1, near ") &&"
syntax error at (eval 41) line 1, near "}}"

2014.02.11 22:34:38 3: Tuer_zu_Abwesend return value: syntax error at (eval 46) line 1, near ") &&"
syntax error at (eval 46) line 1, near "}}"

2014.02.11 22:34:55 3: Tuer_zu_Abwesend return value: syntax error at (eval 48) line 1, near ") &&"
syntax error at (eval 48) line 1, near "}}"

2014.02.11 22:35:21 3: Tuer_zu_Abwesend return value: syntax error at (eval 50) line 1, near ") &&"
syntax error at (eval 50) line 1, near "}}"

2014.02.11 22:35:38 3: Tuer_zu_Abwesend return value: syntax error at (eval 52) line 1, near ") &&"
syntax error at (eval 52) line 1, near "}}"

2014.02.11 22:36:05 3: Tuer_zu_Abwesend return value: syntax error at (eval 54) line 1, near ") &&"
syntax error at (eval 54) line 1, near "}}"

2014.02.11 22:36:21 3: Tuer_zu_Abwesend return value: syntax error at (eval 56) line 1, near ") &&"
syntax error at (eval 56) line 1, near "}}"

2014.02.11 22:36:48 3: Tuer_zu_Abwesend return value: syntax error at (eval 58) line 1, near ") &&"
syntax error at (eval 58) line 1, near "}}"

define HandyRoland PRESENCE lan-ping 192.168.170.6 30 10
attr HandyRoland anwesenheit1 Anwesenheit
attr HandyRoland room Anwesend

define LaptopRV PRESENCE lan-ping 192.168.170.5 30 10
attr LaptopRV anwesenheit1 Anwesenheit
attr LaptopRV room Anwesend

define Anwesenheit structure anwesenheit1 HandyRoland LaptopRV
attr Anwesenheit clientstate_behavior relative
attr Anwesenheit clientstate_priority present absent
attr Anwesenheit room Anwesend

define Tuer_zu_Abwesend notify Anwesenheit:absent {my $hm == sprintf ("%%02d:%%02d", $hour, $min) ;; if ($hm gt "08:00" || $hm lt "22:00") && (Value("Tuerschloss") =~ m/^unlocked/) { fhem("set Tuerschloss lock") }}
attr Tuer_zu_Abwesend room Anwesend
Cubietruck mit Stefanius Image
FHEM 5.8
HMLAN
und CUL

yogiflop

Zitat von: Roli1606 am 11 Februar 2014, 20:52:12
Ich habe das direkt in eine .cfg datei geschrieben die in die fhem.cfg eingebunden ist.

Hab jetzt 2 Semikolon eingefügt und nun kommt eine andere Fehlermeldung

2014.02.11 20:49:21 3: Tuer_zu_Abwesend return value: syntax error at (eval 41) line 1, near ") &&"
syntax error at (eval 41) line 1, near "}}"

define Tuer_zu_Abwesend notify Anwesenheit:absent { my $hm == sprintf ("%%02d:%%02d", $hour, $min) ;; if ($hm gt "08:00"||$hm lt "22:00") && (Value("Tuerschloss") =~ m/^unlocked/) { fhem("set Tuerschloss lock") }}
attr Tuer_zu_Abwesend room Anwesend


Versuche mal bitte :

define Tuer_zu_Abwesend notify Anwesenheit:absent { my $hm == sprintf ("%%02d:%%02d", $hour, $min) ;; if ( ($hm gt "08:00"||$hm lt "22:00") && (Value("Tuerschloss") =~ m/^unlocked/) ) { fhem("set Tuerschloss lock") }}
attr Tuer_zu_Abwesend room Anwesend
CubieTruck mit FHEM 5.7
433MHz, 868MHz HMLan
div. Baumarktsteckdosen, 3x HM
div. MiLight's

Roli1606

Habe es jetzt so hin bekommen. Die Tür schliest ab und auch wieder auf so wie es sein soll. Nur möchte ich nicht das meine Tür sofort abgeschlossen wird sobald ich offline bin sondern erst eine halbe Stunde verzögert. Ist es einfacher Das in der Structure unterzubringen oder wie kann ich das am besten lösen?


define Anwesenheit structure anwesenheit1 HandyRoland LaptopRV
attr Anwesenheit clientstate_behavior relative
attr Anwesenheit clientstate_priority present absent
attr Anwesenheit room Anwesend

define Tuer_zu_Abwesend notify Anwesenheit:absent { my $hm == sprintf ("%%02d:%%02d", $hour, $min) ;; if (($hm gt "08:00" || $hm lt "22:00") && (Value("Tuerschloss") =~ m/^unlocked/))  { fhem("set Tuerschloss lock") }}
attr Tuer_zu_Abwesend room Anwesend

define Tuer_auf_Anwesend notify Anwesenheit:present { my $hm == sprintf ("%%02d:%%02d", $hour, $min) ;; if (($hm gt "08:00" || $hm lt "22:00") && (Value("Tuerschloss") =~ m/^locked/))  { fhem("set Tuerschloss unlock") }}
attr Tuer_auf_Anwesend room Anwesend


Gruß Roland
Cubietruck mit Stefanius Image
FHEM 5.8
HMLAN
und CUL

Jupp

Hallo Roland,
ich habe bei der Schaltung einer übergreifenden Abwesenheit mit einer Struktur gearbeitet. Da ich außerdem nicht wollte, dass die Abwesenheit zu zügig geschaltet wird habe ich mit einem Watchdog gearbeitet, der meinen Anwesenheitsdummy erst ab einer Abwesenheit von min.  3 Minuten schaltet:
# dummyJupp auf abwesend setzen nach 3 Min Abwesenheit
define wd_iPhoneJuppAbwesend watchdog iPhoneJupp:absent 00:03 iPhoneJupp:present set dummyJupp off
attr wd_iPhoneJuppAbwesend regexp1WontReactivate 1

# dummyJupp auf on setzen bei Anwesenheit
define dummyJuppOn notify iPhoneJupp:present { fhem ("set dummyJupp on;; setstate wd_iPhoneJuppAbwesend defined") if (Value("dummyJupp") ne "anwesend") }

iPhoneJupp ist dabei das PRESENCE Gerät. Bei uns gibt es 2 Geräte für die Abwesenheit, die beide über den Watchdog einen Dummy schalten. Beide Dummies sind in eine Struktur gefasst und voila...da ist sie, die kumulierte Abwesenheit :)
# Gemeinsame Anwesenheit
define Anwesenheit structure AtHome dummyAnke dummyJupp
attr Anwesenheit clientstate_behavior relative
attr Anwesenheit clientstate_priority on|anwesend off|abwesend
attr Anwesenheit devStateIcon anwesend:status_available abwesend:status_away_1
attr Anwesenheit eventMap on:anwesend off:abwesend


Ich hoffe es hilft.

Gruß
Jupp

Roli1606

Hallo ich bin immer noch nicht so weit das es läuft. Ich überwache eine Structure mit dem Watchdog und möchte einen Dummy in dem angegebenen Zeitraum schalten. Kommen aber fehler im Log.

2014.02.14 22:40:52 3: Watchdog WD_Abwesenheit triggered
2014.02.14 22:40:52 3: Unknown command my, try help.
Unknown command if, try help.

ist da ein Fehler drin oder geht das garnicht?

define WD_Abwesenheit watchdog Handys_anwesend:absent 00:00:01 { my $hm == sprintf ("%%02d:%%02d", $hour, $min) ;; if (($hm gt "20:15" && $hm lt "22:59") } Handys_anwesend:present set Anwesenheit absent
attr WD_Abwesenheit room Anwesend
Cubietruck mit Stefanius Image
FHEM 5.8
HMLAN
und CUL

Jupp

Hallo Roland,

hat ein wenig gedauert, sorry...

Du hast scheinbar das Watchdog-Command ein wenig verdreht. Die Hilfe lässt sich folgendermaßen aus:

define <name> watchdog <regexp1> <timespec> <regexp2> <command>


Auf Dein define übertragen heißt das:

  • <regexp1> --> Handys_anwesend:absent
  • <timespec> --> 00:00:01
  • <regexp2> --> { my $hm == sprintf ("%%02d:%%02d", $hour, $min) ;; if (($hm gt "20:15" && $hm lt "22:59") }
  • <command> --> Handys_anwesend:present
Das Problem liegt also bei <regexp2>. Dort hast Du ein Perl-Coding; allerdings sollte dort Handys_anwesend:present stehen. Probier es also mal hiermit:
define WD_Abwesenheit watchdog Handys_anwesend:absent 00:00:01 Handys_anwesend:present set Anwesenheit absent
Das Perl-Coding sieht für mich so aus, als wolltest Du das set Anwesenheit absent nur zwischen 20:15 und 22:59 schalten lassen, sehe ich das richtig? Dann solltest Du das auch in Deinem <command> verwursten. Z.B. so:

define WD_Abwesenheit watchdog Handys_anwesend:absent 00:00:01 Handys_anwesend:present {my $hm == sprintf ("%%02d:%%02d", $hour, $min) ;; if (($hm gt "20:15" && $hm lt "22:59") { fhem "set Anwesenheit absent" } }

Klappt es damit?

Wichtig dabei wäre noch, dass Du Deinem Watchdog sagst, dass er nicht bei jedem Feststellen der Abwesenheit zwischen 20:15 und 22:59 feuert; da der Präsenz-Dienst im Regelfall recht fleißig ist und alle paar Minuten ein Event auf An- oder Abwesenheit feuert würde demenstprechend auch jedes Mal das <command> ausgeführt werden. Du solltest bei Deinem Watchdog also noch etwas hinzufügen:

attr WD_Abwesenheit regexp1WontReactivate 1


Viele Grüße
Jupp

Roli1606

Hallo Jupp Danke für die Hilfe. Ich habe am Sonntag abend eine etwas andere Lösung hin bekommen.  Habe die of Bedingung mit der zeit raus genommen und schaue den Watchdog einfach auf triggered wenn er nicht mehr schalten soll.  Ich bin mir aber noch nicht ganz sicher ob alles schon so funktioniert wie ich es möchte. Werde noch ein wenig testen und dann meine Fertige configuration hier einstellen. 

Gruß Roland

Gesendet von meinem GT-I8190 mit Tapatalk

Cubietruck mit Stefanius Image
FHEM 5.8
HMLAN
und CUL

Roli1606

Hier nochmal der komplette Code wie es jetzt läuft. Habe das Precense ausgetauscht da das Anpingen  zu unzuverlässig war. Die Anwesenheit wir jetzt über die Tasker App auf den Handys geschaltet.

## Handy Roland
define Handy_Roland dummy
attr Handy_Roland Anwesenheit Handys_anwesend
attr Handy_Roland room Anwesend

## Handy Verena
define Handy_Verena dummy
attr Handy_Verena Anwesenheit Handys_anwesend
attr Handy_Verena room Anwesend

## Structure beide Handys
define Handys_anwesend structure Anwesenheit Handy_Roland Handy_Verena
attr Handys_anwesend clientstate_behavior relative
attr Handys_anwesend clientstate_priority present absent
attr Handys_anwesend room Anwesend

define Anwesenheit dummy
attr Anwesenheit room Anwesend

## WD an aus
define WDonoff dummy
attr WDonoff room Anwesend
attr WDonoff setList on off
attr WDonoff webCmd on:off

define WD_Abwesenheit watchdog Handys_anwesend:absent 00:15:00 Handys_anwesend:present set Anwesenheit absent;; setstate WD_Abwesenheit defined
attr WD_Abwesenheit regexp1WontReactivate 1
attr WD_Abwesenheit room Anwesend

define WD_Anwesenheit watchdog Handys_anwesend:present 00:00:01 Handys_anwesend:abesent set Anwesenheit present;; setstate WD_Anwesenheit defined
attr WD_Anwesenheit room Anwesend

define WDaktiv notify WDonoff {if (Value("WDonoff") eq "on") {fhem("setstate WD_Abwesenheit defined;; setstate WD_Anwesenheit defined")} else {fhem("setstate WD_Abwesenheit triggered;; setstate WD_Anwesenheit triggered")}   }

define Tuer_zu_Abwesend notify Anwesenheit:absent { if (Value("Tuerschloss") =~ m/^unlocked/)  { fhem("set Tuerschloss lock") }}
attr Tuer_zu_Abwesend room Anwesend

define Tuer_auf_Anwesend notify Anwesenheit:present { if (Value("Tuerschloss") =~ m/^locked/)  { fhem("set Tuerschloss unlock") }}
attr Tuer_auf_Anwesend room Anwesend

## Zeitschaltung

##Wohnungstür von Sonntag bis Donnerstag täglich um 23:00 Uhr absperren
define WohnungstuerSoBisDoVerriegeln at *23:00 {if (($wday==0) ||($wday==1)||($wday==2)||($wday==3)||($wday==4)) {fhem("set Tuerschloss lock;; set WDonoff off") }}

##Wohnungstür am Freitag und Samstag um 23:59 Uhr nachts absperren
define WohnungstuerVonFrBisSaVerriegeln at *23:59 {if (($wday == 5) || ($wday == 6)) {fhem("set Tuerschloss lock;; set WDonoff off") }}

##Wohnungstür von Mo bis Sa um 05:35 Uhr entriegeln
define WohnungstuerVonMoBisSaentriegeln at *05:35 {if (($wday == 1) || ($wday == 2) || ($wday == 3) ||($wday == 4) || ($wday == 5) || ($wday == 6)) {fhem("set Tuerschloss unlock  if (Value('Anwesenheit') eq 'present');; set WDonoff on;; trigger Anwesenheit") }}

## Wohnungstür am Sonntag um 09:00 Uhr entriegeln
define WohnungstuerAmSoEntriegeln at *09:33 {if (($wday == 0)) {fhem("set Tuerschloss unlock  if (Value('Anwesenheit') eq 'present');; set WDonoff on;; trigger Anwesenheit") }}

##FileLog
define FileLog_Anwesenheit FileLog ./log/Anwesenheit-%Y.log Handy_Roland|Handy_Verena|Anwesenheit|Handys_anwesend|WD_Abwesenheit|WD_Anwesenheit|Tuer_zu_abwesend|Tuer_auf_anwesend|WohnungstuerAmFrSaVerriegeln
attr FileLog_Anwesenheit logtype text
attr FileLog_Anwesenheit room Anwesend
attr FileLog_Anwesenheit verbose 5



Gruß Roland
Cubietruck mit Stefanius Image
FHEM 5.8
HMLAN
und CUL