Hauptmenü

Presence/Absende

Begonnen von abc2006, 18 April 2013, 11:40:01

Vorheriges Thema - Nächstes Thema

abc2006

Hallo,

ich fürchte, ich habe das mit dem Presence-Modul noch nicht ganz verstanden.

In meiner Fhem.cfg steht folgendes drin:

define Handy_Stephan PRESENCE fritzbox SGS2-Stephan
### Anwesend?
define watchdog_Anwesenheit_Handy_Stephan watchdog Handy_Stephan:present 00:01 Handy_Stephan:absent { fhem("set Funkschalter2 on");;}


Meine Fragen:

Was genau macht der watchdog?

Wenn der eintrag Handy_Stephan:present kommt, dann wartet er 1 Minuten und dann ? schaltet er den Funkschalter ein ?

im Log bekomme ich folgende Einträge:
2013.04.18 11:33:12 5: Cmd: >{PRESENCE_ProcessLocalScan('Handy_Stephan|0|present|10')}<
2013.04.18 11:33:12 5: PRESENCE_ProcessLocalScan: Handy_Stephan|0|present|10
2013.04.18 11:33:12 5: Triggering Handy_Stephan (1 changes)
2013.04.18 11:33:12 5: Notify loop for Handy_Stephan present

Der Funkschalter bleibt aber zuverlässig aus ;-(

Hat jemand ne Idee, wo der Fehler liegt?
Ich verzweifel gerade ;-)

Danke!
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Markus Bloch

Hallo,

der watchdog:


define watchdog_Anwesenheit_Handy_Stephan watchdog Handy_Stephan:present 00:01 Handy_Stephan:absent { fhem("set Funkschalter2 on");;fhem("set watchdog_Anwesenheit_Handy_Stephan defined")}
attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1


Wenn der eintrag Handy_Stephan:present kommt, dann wartet er 1 Minute lang, ob er noch immer "present" ist (und nicht "absent) und schaltet dann den Funkschalter ein.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

abc2006

Hi,
okay,

a) was bewirkt das zweite Attribut "attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1"
b) wie schreibt man sowas, wenn man sagen will:
   "Wenn der Status x ist, und nicht *irgendwas*, dann tue ..." ?
In diesem Beispiel gibt es ja nur zwei Stati, present, oder absent.

Danke!
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Markus Bloch

Zitat von: abc2006 schrieb am Do, 18 April 2013 19:39Hi,
okay,

a) was bewirkt das zweite Attribut "attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1"
Das der Watchdog innerhalb dieser 1 Minuten-Frist nicht nochmal von vorne die 1 Minute zählt, falls innerhalb dieser Frist ein weiteres Event "Handy_Stephan:present" eintrifft.

Zitatb) wie schreibt man sowas, wenn man sagen will:
   "Wenn der Status x ist, und nicht *irgendwas*, dann tue ..." ?
In diesem Beispiel gibt es ja nur zwei Stati, present, oder absent.

Danke!
Stephan

Das ist dann ein klassisches notify:

define Anwesenheit_Handy_Stephan notify Handy_Stephan:present set Funkschalter2 on


Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

abc2006

ich habe jetzt in meiner fhem.cfg stehen


define watchdog_Anwesenheit_Handy_Stephan watchdog Handy_Stephan:present 00:01 Handy_Stephan:absent { fhem("set FHT80B3_BUERO desired-temp 22.5");;}
attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1

define watchdog_Abwesenheit_Handy_Stephan watchdog Handy_Stephan:absent 00:01 Handy_Stephan:present { fhem("set FHT80B3_BUERO desired-temp 17.5");;}
attr watchdog_Abwesenheit_Handy_Stephan regexp1WontReactivate 1


Wenn ich am Handy WLAN deaktiviere, schaltet FHEM wie gewünscht auf "absence" und setzt die Temperatur auf 17.5. Wenn ich WLAN wieder aktiviere, schaltet FHEM auch auf present, aber ändert die Temperatur nicht (auf 22,5). Ich habs Zeichen für Zeichen verglichen, aber es ist doch gleich? Hab ich was übersehen? Oder gibt es einen anderen Grund?

Danke
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Zrrronggg!

define watchdog_Anwesenheit_Handy_Stephan watchdog Handy_Stephan:present 00:01 Handy_Stephan:absent { fhem("set FHT80B3_BUERO desired-temp 22.5");;}
attr watchdog_Anwesenheit_Handy_Stephan regexp1WontReactivate 1


Verstehe ich nicht, was soll das im einzelnen machen soll.

ICH würde das so machen:

define watchdog_Anwesenheit_Handy_Stephan at *00:05:00 {if (Value("Handy_Stephan") eq "present"  { fhem("set FHT80B3_BUERO desired-temp 22.5")} else { fhem("set FHT80B3_BUERO desired-temp 16")} }

Nicht vergessen das FHT mit

attr FHT80B3_BUERO lazy

zu versehen, sonst gibt's Ruck Zuck LOVF Probleme.

FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Markus Bloch

Hallo Stephan,

Bitte vergiss nicht die watchdogs wie in meinem Beispiel oben angegeben mit "setstate <name> defined" wieder scharf zu schalten. Sonst schalten diese nur einmal.

Viele Grüße

Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Wolle02

Hallo Zrrronggg! ,

Zitatdefine watchdog_Anwesenheit_Handy_Stephan at *00:05:00 {if (Value("Handy_Stephan") eq "present"  { fhem("set FHT80B3_BUERO desired-temp 22.5")} else { fhem("set FHT80B3_BUERO desired-temp 16")} }

Ich nehme an, dass du mit dem Code alle 5 Minuten auf "present" prüfen möchtest? Müsste es da in der at Anweisung nicht +*00:05:00 heißen?


Gruß
Wolle

Zrrronggg!

ZitatIch nehme an, dass du mit dem Code alle 5 Minuten auf "present" prüfen möchtest? Müsste es da in der at Anweisung nicht +*00:05:00 heißen?

Ja, korrekt, thx.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

abc2006

Hi,
ich habe jetzt meinen Code durch deinen ersetzt. Zuverlässig schalten tut die Fritzbox bzw. FHEM aber nicht. Woran könnte das jetzt noch liegen?

Wenn ihr Infos von mir braucht, sagt, welche.

Danke und lg
stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Brice

Muss da nicht noch ein "setstate watchdog_Anwesenheit_Handy_Stephan defined" angefügt werden?

Probiere es mal mit:

define watchdog_Anwesenheit_Handy_Stephan at +*00:05:00 {if (Value("Handy_Stephan") eq "present" { fhem("set FHT80B3_BUERO desired-temp 22.5")} else { fhem("set FHT80B3_BUERO desired-temp 16")} };; setstate watchdog_Anwesenheit_Handy_Stephan defined

Ohne Gewähr ;-)
FHEM auf RPi 4 4GB (Buster) | produktiv) CUL 868 für FS20 | S300TH | KS300 | Max!Cube als CUN 868 für TechemWZ | HM-MOD-RPI-PCB für HM | Z-Wave ZME_UZB1 | FRITZ!DECT 200 | HUE | Lightify | Echo Dot | WS3080

abc2006

Hi,

Frage a): Was macht das setstate defined? Momentan hab ich das Problem, dass ich den Code nicht verstehe und daher keine Fehler finde.
Frage b) Du schreibst hinter das statement ";;". Zronggg schreibt nirgendwo ";;". Ich würde ";;" hinter den Perl-Code, aber vor die letzte "}" schreiben. Wo bzw. wie ist es richtig?
Frage c) ich habe den Abschnitt in die fhem.cfg kopiert, konkret geht es um den teil mit [...]fhem("set irgendwas")[...]  Das habe ich dann übers Webfrontend geändert ( auf "DEF" klicken). nun steht da [...] fhem set irgendwas on[...]. Sind die runden Klammern überflüssig/notwendig/falsch?


Danke
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Zrrronggg!

ZitatIch würde ";;" hinter den Perl-Code, aber vor die letzte "}" schreiben.


Das ist definitiv nicht notwendig. Ich hole mal ein bisschen aus.

Das Semikolon trennt mehrere FHEM Kommandos ab, das DOPPELTE Semikolon "escaped" das Semicolon im PERLteil eines FHEM Kommandos, da EIN Semikolon von PERL als Code interpretiert wird. Das zweite Semikolon bleibt dann quasi übrig in der Funktion als Trenner.


Zur Verdeutlichung:

FHEM Commandozeilen gehen so:

commando 1 ; commando 2

Wenn Sachen machen will die FHEM nicht kann, PERL aber wohl (z.b. IF-Abfragen) dann sagt man FHEM, dass bestimmter Code PERL sei. Nämlich in dem man diesen Code in geschweiften Klammern schreibt:

fhemirgnedwas { Hier steht alles PERL Code drin }

Wenn man nun INNERHALB von PERL Code doch wieder FHEM Kommandos abgeben will (und das will man ja in der Regel) dann muss man PERL mitteilen, das bestimmter Code an FHEM zurückgegeben werden soll. Das macht man durch
{ fhem("... ") }

Wenn man nun innerhalb dieses FHEM Codes (der innerhalb PERL Codes liegt) mehrere Kommandos reihen will, muss man die - wie bei FHEM üblich-  per Semikolon abtrennen... und da PERL das Semikolon verschlucken würde, muss man ZWEI Semikolons schreiben... aber immer nur zur Abtrennung von FHEM Kommandos.

Die Struktur gemischter Dinge ist dabei oft

fhemirgendwas {PERLirgendwas  { fhem("kommando1 ;; kommando 2 ") }}


z.b.

define test at *04:00:00  {(Value("Handy_Stephan") eq "present" { fhem("set Licht1 on ;; set Licht2 on ") }}


Daraus ergibt  sich:

1. nach dem letzten FHEM Kommando muss kein Abtrennzeichen, weil kein weiteres Element der Aufzählung folgt.

Es ist weder erforderlich in FHEM zu schreiben:
set Licht1 on; set Licht 2 on;

noch

define test at *04:00:00  {if (Value("Handy_Stephan") eq "present" { fhem("set Licht1 on ;; set Licht2 on ;; ") }}

und erst recht nicht

define test at *04:00:00  {(Value("Handy_Stephan") eq "present" { fhem("set Licht1 on ;; set Licht2 on ");; }}

Zum Glück machen die Zeichen aber auch meistens nix, sodass Code noch funktioniert wenn man sie überflüssigerweise einfügt.

2. Ebenfalls sehr häufig sieht man hier in letzter Zeit Code, der so aufgebaut ist:

define test at *04:00:00  { fhem("set Licht1 on ;; set Licht2 on ") }

oder so:

define test at *04:00:00 { fhem("set Licht1 on") } ;; { fhem("set Licht2 on") }

Beides ist komplett überflüssig, da hier durch die  
"{"
Klammer gesagt wird: Es kommt jetzt PERL (obwohl mit PERL weiter nichts gemacht wird) nur um PERL dann sofort mit
fhem("
zu sagen: und jetzt kommen nur FHEM Kommandos. Noch weniger notwendig ist das Vorgehen des 2.Beispiels, nämlich mehre FHEM Komandos einzeln in PERL einzukapseln.



Es bleibt die Frage: Wir kommt das alles. wieso machen das viele hier?

Ich sehe da mehrere Gründe.
Zum ersten ist hier viel Cargo-Cult Programming zu sehen. (kann man in Wikipedia nachlesen)
D.H. Leute haben irgendwo gesehen, dass was bestimmtes funktioniert und schreiben das ab bzw. verändern dass, ohne eigentlich zu verstehen was welche Elemente bedeuten.
Zum Glück ist FHEM recht robust, sodass viel Kram tatsächlich funktioniert, auch wenn man überflüssiges reinschreibt oder seltsam formatiert oder Abtrennungen nach dem letzten Element einer Kette einfügt etc.
Der Nächste glaubt dann, der Code funktioniere nicht TROTZ dieser überflüssigen Konstrukte sondern WEGEN dieser Konstrukte und baut das bei sich auch ein, im Glauben das müsse so.

En anderer Grund ist, das Leute vorhandenen Beispielcode vereinfachen .

Wer z.b.

define test at *04:00:00  {if irgendwas  { fhem("set Licht1 on ;; set Licht2 on") }}

als Beispiel findet und sich sagt: "Ach, die IF Abfrage brauche ich eigentlich nicht" wird den Ausdruck dann zu

define test at *04:00:00   { fhem("set Licht1 on ;; set Licht2 on") }

vereinfachen... und siehe da: geht auch. Habe ich z.b. am anfang viel so gemacht.
Das hier eigentlich
define test at *04:00:00   set Licht1 on ;; set Licht2 on
richtig sein würde,  wird einem erst später klar.

So ist das Semikolon am Ende einer Befehlskette z.b. ein Artefakt aus der strukturierten Schreibweise, in der tatsächlich Zeilen berechtigterweise mit einem Semikolon (oder 2) ENDEN, aber eben nur, wenn in der nächsten Zeile weitere Befehle kommen.


Lange rede kein Sinn: die ";;" am Ende sind überflüssig!





FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

Ralph

Das hast Du sehr gut erklärt, ich werde versuchen es zu verinnerlichen (daumenhoch)
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

abc2006

Hi Zrrronggg,

Danke für die ausführliche Erklärung. Das Beispiel

Zitatfhemirgendwas {PERLirgendwas { fhem("kommando1 ;; kommando 2 ") }}

finde ich super! hierbei erkennt man ( bzw. ich) mal genau, was wohin gehört.


Zitatund schreiben das ab bzw. verändern dass, ohne eigentlich zu verstehen was welche Elemente bedeuten.

Genau das ist gerade mein Problem! Aber wenn ich jetzt weiss, wie es richtig sein muss, kann ich ja mithelfen, die Beispiele zu korrigieren:-)
Danke für die ausführliche erklärung, vielleicht willst du ja deinen Post einfach mal so als Programmiererklärung im Wiki veröffentlichen?

konkret zum Problem:
Das hier

define watchdog_Anwesenheit watchdog Handy_Stephan:absent 00:00:10 Handy_Stephan:present { fhem "set K5_BAD_LICHT_SPIEGEL toggle";; fhem "setstate watchdog_Anwesenheit defined";;}
attr watchdog_Anwesenheit regexp1WontReactivate 1



müsste eigentlich heissen

define watchdog_Anwesenheit watchdog Handy_Stephan:absent 00:00:10 Handy_Stephan:present set K5_BAD_LICHT_SPIEGEL toggle; setstate watchdog_Anwesenheit defined
attr watchdog_Anwesenheit regexp1WontReactivate 1

ja ?

zu deinem Beitrag: Muss es nicht eigentlich nur ein semikolon zwischen den set-Befehlen sein:?  ( und ein plus bei dem at)

ZitatDas hier eigentlich

define test at +*04:00:00   set Licht1 on ; set Licht2 on

richtig sein würde, wird einem erst später klar.


und das ganze kann man dann noch weiter vereinfachen xD:

define test at +*04:00:00   set Licht1,Licht2 on


lg
stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX