notify setstate verschachteln bzw. aneinanderreihen?

Begonnen von Tommyland78, 12 November 2014, 14:09:01

Vorheriges Thema - Nächstes Thema

Tommyland78

Hallo zusammen,

ich habe bei meiner Suche nicht wirklích eine Anleitung gefunden, wohlmöglich, dass ich auch die falschen Suchbegriffe nutze.

Ich habe mir einen Dummy angelegt um meinen eigenen Anwesenheitsstatus abbilden zu können.
define Tom_Status dummy
attr Tom_Status setList anwesend abwesend


ich überprüfe die IP meines Smartphones mittels
define Toms_Smartphone PRESENCE lan-ping 192.168.0.11

Jetzt möchte ich auf dieser Grundlage ein Notify erstellen.
Ich möchte an den Dummy den Wert meiner Anwesenheit, also anwesend oder abwesend hinterlegen.
Dazu habe ich folgendes gemacht:
define Anwesenheit_Tom notify Toms_Smartphone:absent setstate Tom_Status abwesend

Das funktioniert offensichtlich...
Meine Frage ist nur, wie bekomme ich jetzt die an- und abwesenheit übertragen.
Also wie "verschachtele" ich das jetzt?
define Anwesenheit_Tom notify Toms_Smartphone:absent setstate Tom_Status abwesend
define Anwesenheit_Tom notify Toms_Smartphone:present setstate Tom_Status anwesend



  • Wie bekomme ich das in eine Zeile?
  • Muss ich IF nutzen?
  • Kann ich das Notify umgehen und "Lan-Ping" gleich mit einem Notify ausstatten um den Wert der Anwesenheit nach "Anwesenheit_Tom" zu schreiben?

Ich stehe mit meinen Überlegungen noch am Anfang und verstehe vieles noch nicht, obwohl es viele und teilweise auch gute Anleitungen gibt!
Also Sorry wenn die Frage eher nach RTFM schreit.

Grüße
Der Tom

justme1968

dein Toms_Smartphone device hat doch den status. warum willst du ihn noch mal in einen dummy kopieren?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Puschel74

Andre,
auch ein Temperatursensor hat sein Reading und dennoch will es ein User ums erbrechen in einen Dummy kopieren (damit er was dabei lernt  :o ).
Ich frag da nichtmehr nach - und halt mich da auch raus.
Es gibt mittlerweile zuhauf Beiträge dazu und wer nicht suchen will kann warten.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Paul

Warum machst du es nicht einfach so:

rename Toms_Smartphone Tom_Status
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

Tommyland78

Hallo zusammen,

ich hatte ja bereits geschrieben, dass meine Überlegung, bzw. mein Vorhaben nicht unbedingt schlau ist und ich gern auch andere Lösungen mir anhöre.
Ziel ist es ja, dass ich verstehe wie Dinge angegangen werden können.

Vielleicht zum besseren Verständnis warum ich diesen Weg über einen Dummy gegangen bin.
Ziel war es, dass ich ein Dummy oder was hier ggf. besser geeignet ist nutzen kann um ein Icon/Status-Anzeige anzeigen zu lassen, wenn eine bestimmte Bedingung erfüllt ist.
Grundlegend kann ich ja gleich den Anwesenheitstatus meines Smartphones nutzen um die Anzeige zu generieren, allerdings - und da kommen wir zur Aussage von Puschel - ich wollte für mich verstehen wie das funktionieren muss. Also wie "baue" ich so einen Dummy. Es geht mir ums lernen und eigenständigem Nachbau und Modifizierung. Wenn ich eine Grundlage habe die fehlerfrei ist, dann kann ich da immer nachsehen wie es richtig ist....

Wie übergebe ich also 1,2 oder mehr Stati an einen Dummy? Muss ich für jeden Status ein eigenes "Notify" schaffen?
z.B. Möchte ich ein Dummy zur Anzeige haben ob es zwischen 0 und 6 Uhr ist, zwischen 6 und 12 Uhr, zwischen 12 und 18 Uhr und ob es zwischen 18 und 24 Uhr ist.
Also 4 mögliche Stati die ich am Ende mittels verschiedenen Icons abbilden will.

Das ist nicht unbedingt sinnig und auf die Uhr sehen kann ich selber, möchte aber in diesem Zusammenhang oben beschriebene, fehlerfreie Vorlage haben.

Ich würde mich freuen, wenn Ihr mich hier unterstützen könntet.

Grüße
Der Tom

Puschel74

#5
Hallo,

hier:
http://forum.fhem.de/index.php/topic,29002.0.html

Wie du einen Dummy "baust" findest du in der commandref - Stichwort Dummy und auch im Wiki sollte sich was finden lassen.
Ich bin mir jetzt nicht sicher ob nicht im Einsteiger.pdf auch was steht dazu.

setstate ändert nur den Status und löst KEIN Event aus - soweit ich weiß.

Aber bitte nicht böse sein.
Diese deine Frage wurde bereits x-mal gestellt und du wirst sicher verstehen das niemand beim x+1-mal noch die Lust hat alles zu erklären.
Ein Dummy definieren, Werte aus Readings auslesen und in den Dummy schreiben hab ich dir verlinkt.

Du kannst in einem notify mehrere if-Abfragen einbauen - wichtig ist dabei das regexp (also das worauf das notify reagiert).
Aber auch dazu gibt es bereits gefühlt  ??? Beiträge dazu.

Wenn du Probleme mit einem Code hast und die Fehlermeldung dazu posten kannst wird dir hier sicher gerne geholfen werden aber einen Workshop "Wie kann ich was mit FHEM machen" wird es hier speziell für dich nicht geben - den halt Uli mit dem Einsteiger.pdf schon geschrieben.

Aber als kleine Hilfe und Denkanstoss für deine "Uhr".
at wäre das Zauberwort  ;)

Grüße

edith: Ja es ist hier der Anfängerbereich und es dürfen natürlich Fragen gestellt werden, die werden auch beantwortet.
Ob die Antworten im Sinne des Fragestellers sind steht auf einem anderen Blatt.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Tommyland78

Hallo Puschel,

wie ein Dummy gebaut wird ist mir, so hoffe ich zumindest, bekannt.
Mir ging es in erster Linie um die Frage, wie in in einer Zeile mehrere Abfragen und Bedingungen hintereinander geschachtelt werden.

Dabei ging es mir auch um die 3 Möglichkeiten die mir hier zur Verfügung stehen.

FHEM-eigene
PERL
IF

Ich würde zur IF-Variante tendieren, wollte aber auch gefragt wissen, ob es bessere Lösungen innerhalb FHEM gibt.
Da sich die meisten Postings auf IF beziehen, würde ich hier aufsetzen wollen.

P.S. Das ich zum x-ten Mal diese Frage stelle habe ich mir fast gedacht, wenn man aber nicht so recht weis nach was man denn suchen muss, dann wirds schwer.
Ach die angemerkten Anleitungen und Dokumentationen habe ich gelesen, diese werden ja ausdrücklich empfohlen und sind in vielerlei Hinsicht empfehlenswert.
Dennoch können Sie eine Frage nicht ohne weiteres beantworten.

Dennoch erst einmal vielen Dank für Hinweise und gedanklichen Himmelsrichtungen.
Ich habe auf dieser Grundlage die eine oder andere Suche erfolgreicher durchführen können.

Grüße
Der Tom

Puschel74

Hallo,

ZitatMir ging es in erster Linie um die Frage, wie in in einer Zeile mehrere Abfragen und Bedingungen hintereinander geschachtelt werden
Schau dir meine Beispiele hier im Forum an.

Es ist nicht notwendig alles in EINE Zeile zu pferchen.
FHEM versteht ein notify oder at durchaus auch wenn es aus mehreren Zeilen besteht (die dann natürlich syntakitsch richtig aufgebaut sein müssen).
Dabei hilft dir das bearbeiten des DEF ungemein.
Du kannst deinen Code in Notepad++ erstellen, wie beschrieben in die Befehlszeile einfügen und per klick auf DEF vervollständigen.
Ah, ok anderer Beitrag - zum "wie beschrieben in die Befehlszeile einfügen" kannst du in der erweiterten Suche mal nach fhem.cfg bearbeiten und User *puschel74suchen.

ZitatDabei ging es mir auch um die 3 Möglichkeiten die mir hier zur Verfügung stehen.
FHEM-eigene und IF gehören zusammen - IF ist nur die FHEM-Variante von if (und if ist Perl).
Aber auch das lässt sich mWn auf mehrere Zeilen aufteilen und so übersichtlicher gestalten.
Übrigens das mMn einzig sinnvolle Anwendungsgebiet von - ich will den Code übersichtlich haben  ;)

Sonst gilt auch hier - Finger weg von der fhem.cfg, der einzige der darin "lesen" muss ist der Interpreter  8)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Tommyland78

So...einige Seiten lesen später habe ich in der direkten Eingabe in FHEM mit dieser Zeile "glück" das es funktioniert....
IF ([Toms_Smartphone:state] == "absent") (setstate Tom_Status_Halle abwesend) ELSE (setstate Tom_Status_Halle anwesend)

allerdings und das ist mein Problem, im DEF meines Notify geht das leider nicht!
Das Notify steht zwar auf "active" aber da müsste ja eigentlich ein Datum und eine Uhrzeit stehen oder?

Kann mir jemand die richtige Lösung zur Codezeile nennen?

Grüße
Der Tom

Damian

#9
Zitat von: Tommyland78 am 13 November 2014, 20:43:47
So...einige Seiten lesen später habe ich in der direkten Eingabe in FHEM mit dieser Zeile "glück" das es funktioniert....
IF ([Toms_Smartphone:state] == "absent") (setstate Tom_Status_Halle abwesend) ELSE (setstate Tom_Status_Halle anwesend)

allerdings und das ist mein Problem, im DEF meines Notify geht das leider nicht!
Das Notify steht zwar auf "active" aber da müsste ja eigentlich ein Datum und eine Uhrzeit stehen oder?

Kann mir jemand die richtige Lösung zur Codezeile nennen?

Grüße
Der Tom

Probier mal:

define di_absent DOIF ([Toms_Smartphone:state] eq "absent") (setstate Tom_Status_Halle abwesend) DOELSE (setstate Tom_Status_Halle anwesend)

hierbei brauchst du kein notify. Tipp: Vergleiche mit Zeichenketten werden mit eq und nicht mit == definiert. Das gilt für Perl-if aber auch für IF oder DOIF.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tommyland78

Hallo Damian,

leider funktioniert Deine Version nicht...genau so wie die meinige, welche ich nochmal umgeschrieben habe...

define Testversuch NOTIFY IF ([Toms_Smartphone:state] eq "absent") (setstate Tom_Status_Halle abwesend) ELSE (setstate Tom_Status_Halle anwesend)

Ich vermute, irgendwas stimmt am Syntax nicht.

Grüße
Der Tom

Damian

Zitat von: Tommyland78 am 14 November 2014, 10:37:40
Hallo Damian,

leider funktioniert Deine Version nicht...genau so wie die meinige, welche ich nochmal umgeschrieben habe...

define Testversuch NOTIFY IF ([Toms_Smartphone:state] eq "absent") (setstate Tom_Status_Halle abwesend) ELSE (setstate Tom_Status_Halle anwesend)

Ich vermute, irgendwas stimmt am Syntax nicht.

Grüße
Der Tom

Deine Konstruktion kann auch nicht funktionieren, weil hinter notify ein regexp (regulärer Ausdruck) kommt. Diese Konstruktion ist auch dann nicht sinnvoll, wenn sie funktionieren würde, weil du bei jedem Event schalten würdest. Definiere bitte meinen Vorschlag mit DOIF und tippe danach list <dein DOIF-Modul> in der Kommandozeile und poste hier anschließend den Output. Dann kann ich dir sagen, was falsch ist.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tommyland78

Ah moooment...

das war wohl mein Fehler. Ich bin von Falschen Tatsachen ausgegangen.
Also zu erst, ja es geht, allerdings mit Einschränkungen, dazu gleich mehr.

Du beziehst Dich bei Deiner Aussage "bei jedem Event schalten würdest" darauf, dass ich den ELSE-Bereich noch habe?
Daher, egal welcher Zustand vorliegt, es würde eine Aktion ausgeführt werden obwohl dies nicht notwendig ist?

Warum funktioniert mein IF nicht im Notify? Was mache ich falsch?
Zum Hintergrund, Deine DOIF-Lösung funktioniert, vielen Dank an dieser Stelle, hat aber nicht in der "unsorted" Übersicht ein Datum der letzten Aktualisierung. Hierzu müsste ich erst ins DOIF reingehen um die Zeiten/Daten zu sehen. Zumindest sieht es bei mir erst mal so aus.

Warum nutzt Du DOIF? Ist dies die bessere Lösung, da es nur dann eine Aktion gibt, wenn es auch eine Änderung zu vollziehen gibt?
Oh...wer lesen kann... do always - Aber nun gut, im Grunde wird es ja nicht benötigt. In meinem Testfall hätte ich meinen eigenen Fehler schneller gefunden - Egal. habs ja verstanden.

Also wenn ich das DOIF mir so weiter durchlese, dann ist es in der Tat viel besser geeignet als meine Notify-Lösung! Bleibt allein die Übersicht bzgl. Datum/Uhrzeit von der ich oben geschrieben habe. Ich will das mal nicht als Problem hinstellen, ich würde lieber fragen wollen welchen Ansatz Du hier hast? Kann ich eine Übersicht alle DOIFs schaffen und die letzte Aktualisierung sehen, so wie es sein würde, wenn ich 20 unterschiedliche Notifys hätte? - Ich hoffe ich habe mich verständlich ausgedrückt.

Grüße
Der Tom

Damian

Zitat von: Tommyland78 am 14 November 2014, 12:16:34
Ah moooment...

das war wohl mein Fehler. Ich bin von Falschen Tatsachen ausgegangen.
Also zu erst, ja es geht, allerdings mit Einschränkungen, dazu gleich mehr.

Du beziehst Dich bei Deiner Aussage "bei jedem Event schalten würdest" darauf, dass ich den ELSE-Bereich noch habe?
Daher, egal welcher Zustand vorliegt, es würde eine Aktion ausgeführt werden obwohl dies nicht notwendig ist?



Warum funktioniert mein IF nicht im Notify? Was mache ich falsch?
Zum Hintergrund, Deine DOIF-Lösung funktioniert, vielen Dank an dieser Stelle, hat aber nicht in der "unsorted" Übersicht ein Datum der letzten Aktualisierung. Hierzu müsste ich erst ins DOIF reingehen um die Zeiten/Daten zu sehen. Zumindest sieht es bei mir erst mal so aus.

Warum nutzt Du DOIF? Ist dies die bessere Lösung, da es nur dann eine Aktion gibt, wenn es auch eine Änderung zu vollziehen gibt?
Oh...wer lesen kann... do always - Aber nun gut, im Grunde wird es ja nicht benötigt. In meinem Testfall hätte ich meinen eigenen Fehler schneller gefunden - Egal. habs ja verstanden.

Also wenn ich das DOIF mir so weiter durchlese, dann ist es in der Tat viel besser geeignet als meine Notify-Lösung! Bleibt allein die Übersicht bzgl. Datum/Uhrzeit von der ich oben geschrieben habe. Ich will das mal nicht als Problem hinstellen, ich würde lieber fragen wollen welchen Ansatz Du hier hast? Kann ich eine Übersicht alle DOIFs schaffen und die letzte Aktualisierung sehen, so wie es sein würde, wenn ich 20 unterschiedliche Notifys hätte? - Ich hoffe ich habe mich verständlich ausgedrückt.

Grüße
Der Tom

Vieles hast du dir schon selbst beantwortet.

Wenn du genauer in der commandref zu notify schaust, dann wirst du sehen, dass hinter notify eine Angabe stehen muss (regexp) auf welche Events er überhaupt triggern muss. Das fehlt bei dir. Da steht direkt IF dahinter. Es müsste zumindest aber:

define Testversuch notify Toms_Smartphone IF ...

stehen.
Eigentlich müsstest du genau die Events von Toms_Smartphone im event monitor analysieren, dir dann ein Buch zu regulären Ausdrücken schnappen und den passenden regulären Ausdruck zu Toms_Smartphone bauen. Das brauchst du z. B. bei DOIF nicht.

Auch ein DOIF hat einen Status und der wird mit cmd1... belegt je nach dem welcher Fall zugeschlagen hat und auch das Datum steht neben dem Zustand. Wenn du was anders im Zustand sehen willst, dann kannst du den Zustand auch anders definieren (siehe commandref). In der commandref von DOIF steht auch etwas zur Zustandsverwaltung, die gibt es bei notify z. B. nicht.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF