Abfragen erstellen

2,185 views
Skip to first unread message

Mitch

unread,
Feb 15, 2012, 7:58:52 AM2/15/12
to fhem-...@googlegroups.com
Hallo Zusammen,

bin seit kurzem fleissiger FHEM User und habe durch diese Gruppe schon viel gelernt.
Leider sind meine Programmierkenntnisse ziemlich veraltern und beziehen sich auf Basic und Pascal (wer das noch kennt :-)
Hab mir jetzt auch ein Pearl Buch bestellt und will mich in das Thema einlesen.

Aktuell würde ich gerne ein paar Abfragen in FHEM einbauen, die mir dann eine Meldung am TV anzeigen.
Wie ich die Meldung generiere und abschicke habe ich bereits rausgefunden und funktioniert.

Die Frage die noch offen ist, wie bekommen ich die Abfragen in FHEM. Die Doku (reference, Wiki, etc.) hat mir da leider nicht weitergeholfen.
Ich möchte etwas wie z.B.
Read Temp im Wohnzimmer - if < 20 Grad then Meldung an TV
Read Fenster Status Bas - if offen then Meldung an TV
Read AussenTemp -if > 20 Grad then Meldung an TV
usw.

Kann mir da jemand bitte etwas unter die Arme greifen und mir etwas "Starthilfe" geben?

Vielen Dank
Markus

UliM

unread,
Feb 15, 2012, 8:47:49 AM2/15/12
to FHEM users
Hi Markus,
Zwei Möglichkeiten:
Du betreibst "Polling", das kommt Deiner Denkweise wohl näher: Einen
timer setzen (at) der zB alle 15 Minuten den Temperatur-Wert des
Sensors prüft und dann ggf Folgeaktionen auslöst.
http://fhem.de/commandref.html#at

fhem funktioniert jedoch Event-getrieben, dann wäre das was Du als
"Read" schreibst in fhem das notify:
http://fhem.de/commandref.html#notify

Der Unterschied in der Denkweise ist:
Du machst nicht ein 'read' wenn Du die Info brauchst, sondern Du
prüfst immer dann, wenn eine Nachricht vom entsprechenden Sensor
eingeht. Also 'sobald der Sensor die Temperatur-Info schickt, prüfe ob
Folgeaktionen erforderlich sind und führe diese ggf aus'.

Meine Vermutung war nun, dass Du innen ein FHT80b hast und draußen ein
S300TH.


> Read Temp im Wohnzimmer - if < 20 Grad then Meldung an TV
So ähnlich wie http://fhemwiki.de/wiki/Heizungskontrolle_Einfach
(nur statt Heizung einzuschalten schickst Du ne Meldung ans TV)

> Read Fenster Status Bas - if offen then Meldung an TV
http://fhemwiki.de/wiki/FHTTK:_Benachrichtigung_bei_offenem_Fenster

> Read AussenTemp -if > 20 Grad then Meldung an TV
#Pseudocode#
define notify MeldungWarm notify AussenTemp {if (%>20) {Nachricht an
TV} }


Gruß + viel Erfolg,
Uli

Mitch

unread,
Feb 15, 2012, 10:54:56 AM2/15/12
to fhem-...@googlegroups.com
Hi Uli,

vielen Dank schonmal.

Hab jetzt anhand den Infos etwas gebastelt und das ist rausgekommen:

define Badfenter +*00:30:00 { if ("{ReadingsVal("FHT_5133", "window", "nA")}" ne "closed"){ fhem "trigger BadFensterOffen") } }
define act_on_BadFensterOffen notify BadFensterOffen " printf "showdialog -time 5 -text Badfenster offen -header FHEM" | nc 192.168.0.7 1450 "

Allerdings bin ich mir mit der ReadingsVal Abfrage noch nicht ganz sicher?

Mitch

unread,
Feb 15, 2012, 11:14:06 AM2/15/12
to fhem-...@googlegroups.com
Hab nochmal ein bischen weiter gemacht:

define n_fenster notify n_fenster {\
my $fenster_offen=0;;\
my $heizung_status={ReadingsVal("FHT_5133","window","nA")};;\
my $ventil=ReadingsVal($_, "window", "nA");;\
if ($ventil = "open") {\
$fenster_offen=1\
}\
}\
if ($fenster_offen != 1) {\
    fhem("trigger BadFensterOffen") \

Mitch

unread,
Feb 15, 2012, 3:32:39 PM2/15/12
to fhem-...@googlegroups.com
Bin am verzeifeln!!

Jetzt komm ich rigendwie nicht weiter.
Folgendes habe ich in der cfg:

define a_Badfenster at +*00:10:00 trigger Badfenster
define Badfenster notify Badfenster { if ({ReadingsVal("FHT_5133", "window", "nA")} ne "closed") { fhem ("trigger BadFensterOffen") } }
define BadFensterOffen notify BadFensterOffen " printf "showdialog -time 5 -text Badfenster offen -header FHEM" | nc 192.168.0.7 1450 "


Das heißt, wenn der Status des Fensters nicht closed ist, dann soll die Meldung verschickt werden.

Leider kommt die Meldung auch wenn das Fenster zu ist.
Wenn ich direkt in die Befehlszeile "{ReadingsVal("FHT_5133", "window", "nA")}" eingebe, bekomme ich ein closed zurück.

Ändere ich das ungleich in ein gleich, kommt keine Meldung mehr??

Zrrronggg!

unread,
Feb 15, 2012, 8:23:45 PM2/15/12
to FHEM users
Hm.

Ich kapier das ganze Teil nicht so richtig. Du lehnst dich offenbar an
das Beispiel im Wiki an, das eigentlich einen erweiterten Zweck hat
und für deinen Fall daher möglicherweise zu komplex ist und ausserdem
das Modul 99_marte.pm (bzw ein Modul mit dem entsprechnden Code)
benötigt, wenn ich das richtig verstehe.

deine Anforderung ist grob folgendes:

Du willst alle 10 Minuten checken ob das Badfenster auf ist.
Du hast einen FHTTK, der am Badfenster ist, und der heisst FHT_5133.
Richtig?
(Komischer Name btw)

Wenn das Fenster auf ist, soll
" printf "showdialog -time 5
-text Badfenster offen -header FHEM" | nc 192.168.0.7 1450 "

abgesetzt werden.

Soweit richtig?

Was ich nicht verstehe ist, warum du zuerst was definierst, das alle
10 Minuten einen check definiert, der nicht direkt die Aktion ausloest
sondern einen weiteres notify ausloest, dass dann erst was macht. Das
ist ja 3x durchs Knie geschossen. Ich kann gerade furchtbar auf dem
Schlauch stehen, aber zumindest im Moment kapier ich nicht, wozu das
ganze Konstrukt gut sein soll.

Ich wuerd sowas versuchen:


define BadFensterChecker at +*00:10:00 { if ("$value{FHT_5133}" ne
"Closed") {"printf "showdialog -time 5 -text Badfenster offen -header
FHEM" | nc 192.168.0.7 1450 " }}

(dieser ganze printf Teil ist von mir undurchdrungen, da ich nicht nur
dem Anschein nach verstehe was das machen soll. Ich nehme an
192.168.0.7 1450 ist deine Glotze, die mit dem gepipten printf Kram
auch was anfangen kann. Das habe ich nur übernommen.)

Aber noch mal der Disclaimer:

Ich selber auch nur Anfaenger hier und mag da irgendeinen Sinn
übersehen. Mir geht es oft so, das hier total komplexe Sachen
abgeliefert werden, um meinem Verstaendnis nach simple Dinge zu
machen, wie die Uhrzeit in allen FHTs setzen und so. Und dann kommen
da Riesenklopper mit arreys und so raus (wie z.b. das WIKI Beispiel,
das aber immerhin noch checkt, ob das Jahr grob hinkommen kann) und
ich schreib dann

define hzg_set_time at *03:00:00 {if ($wday == 5) { fhem("set hzg.*
time") } }

Das setzt einmal pro Woche nachts die Uhrzeit und fertich und ich
komme mir dann immer ganz komisch vor, weil ich denke ich uebersehe
irgendwelche Vorteile oder Nachteile oder so. Ich kuemmer mich dann
schon nicht mal mehr drum, dass selbst { fhem("set hzg.* time") }
eigentlich auch noch einfacher ginge.









On 15 Feb., 21:32, Mitch <bauer.mar...@gmail.com> wrote:
> Bin am verzeifeln!!
>
> Jetzt komm ich rigendwie nicht weiter.
> Folgendes habe ich in der cfg:
>
> *define a_Badfenster at +*00:10:00 trigger Badfenster
> define Badfenster notify Badfenster { if ({ReadingsVal("FHT_5133",
> "window", "nA")} ne "closed") { fhem ("trigger BadFensterOffen") } }
> define BadFensterOffen notify BadFensterOffen " printf "showdialog -time 5
> -text Badfenster offen -header FHEM" | nc 192.168.0.7 1450 "*
>
> Das heißt, wenn der Status des Fensters nicht closed ist, dann soll die
> Meldung verschickt werden.
>
> Leider kommt die Meldung auch wenn das Fenster zu ist.
> Wenn ich direkt in die Befehlszeile "*{ReadingsVal("FHT_5133", "window",
> "nA")}" *eingebe, bekomme ich ein closed zurück.*
>
> *Ändere ich das ungleich in ein gleich, kommt keine Meldung mehr??*
>
> *

Mitch

unread,
Feb 16, 2012, 5:49:09 AM2/16/12
to fhem-...@googlegroups.com
Vielen Dank für Deine Hilfe!

Aber ich denke, kann jetzt nicht testen, dass dein Script nicht funktioniert.
Der Fensterkontakt ist ja nur mit dem FHT80b verbunden, nicht direkt mit der Zentrale (FHZ1300PC).

Somit muss ich ja den windows status vom FHT80b auslesen, deswegen auch FHT_1533, das ist der FHT80b im Bad.
Mit deiner Idee $value{FHT_5133} wird ja nicht der Fensterstatus gelesen, oder?

Der Rest mit printf ist nur noch die Ausgabe auf dem SAT Receiver, sprich auf dem TV.

Rudolf Koenig

unread,
Feb 16, 2012, 6:33:10 AM2/16/12
to fhem-...@googlegroups.com
> Der Fensterkontakt ist ja nur mit dem FHT80b verbunden, nicht direkt mit der
> Zentrale (FHZ1300PC).

Hintergrundinfo: Der Fensterkontakt kann mit dem CUL/CUNO direkt empfangen
werden, mit dem FHZ1x00 nur indirekt ueber das FHT80b.

Mitch

unread,
Feb 16, 2012, 6:54:52 AM2/16/12
to fhem-...@googlegroups.com
Das war mir bewusst, deswegen die Anmerkung, dass der Fensterkontakt an einem FHT80b an der FHZ hängt.

Gibt es denn soetwas wie $value{FHT_5133} auch für den Fensterkontakt?
Sprich eine fertige Variable?

Rudolf Koenig

unread,
Feb 16, 2012, 7:05:22 AM2/16/12
to fhem-...@googlegroups.com
> Gibt es denn soetwas wie $value{FHT_5133} auch f�r den Fensterkontakt?

{ ReadingsVal("FHT5133", "window", "") eq "open" }

siehe auch Detailsicht von FHT5133)

Und statt $value{xxx} empfehle ich Value("xxx"), um beim etwaigen Umbau der
fhem internen Datenstrukturen keine Probleme zu haben.

Mitch

unread,
Feb 16, 2012, 7:17:12 AM2/16/12
to fhem-...@googlegroups.com
Danke Rudolf, das habe ich gestern auch probiert, aber wenn ich equal open nutze, reagiert der Skript gar nicht mehr.

Mir kommt es so vor, als das ReadingsVal("FHT5133", "window", "") irgend etwas anderes ausgibt, als wenn man es im Terminal eingibt?

Zrrronggg!

unread,
Feb 16, 2012, 10:55:11 AM2/16/12
to FHEM users
>FHZ1300PC

okay, DAS habe ich übersehen.

Sorry.

Mitch

unread,
Feb 16, 2012, 2:06:32 PM2/16/12
to fhem-...@googlegroups.com
Alos es geht mit Rudolfs Script auch nicht.

Diese habe ich getestet:

{ if ({ ReadingsVal("FHT_5133", "window", "") ne "closed" }) { fhem...

{ if ({ ReadingsVal("FHT_5133", "window", "") eq "open" }) { fhem...

{ if ({ReadingsVal("FHT_0a58", "window", "nA")} ne "closed") { fhem...

{ if ({ReadingsVal("FHT_0a58", "window", "nA")} eq "open") { fhem...

Es geht einfach nicht :-(

Ja jemand noch eine Idee??

Tausend Dank!

Rudolf Koenig

unread,
Feb 16, 2012, 2:56:28 PM2/16/12
to fhem-...@googlegroups.com
> Ja jemand noch eine Idee??

Ja:
- perl-Buch besorgen, und die Grundlagen durchlesen
- danach(!) unbedingt http://fhem.de/commandref.html#perl lesen.

Ansonsten muesste es so aehnlich sein:

define BadFensterChecker at +*00:10 {\
if(ReadingsVal("FHT_5133", "window", "") ne "closed") {\
my $msg = "showdialog -time 5 -text Badfenster offen -header FHEM";;\
system "echo '$msg' | nc 192.168.0.7 1450";;\
}\
}

\ und ;; kann man sich beim Editieren in FHEMWEB Detail-Ansicht des at Kommandos
sparen. D.h. erst definiere ich in FHEMWEB in der Eingabezeile oben:
define BadFensterChecker at +*00:10 hello
danach gehe ich auf Unsorted/BadFensterChecker und klicke auf DEF.

Sonst: die Reihenfolge der showdialog Parameter kommt mir komisch vor. Und ich
habe nichts getestet.

Mitch

unread,
Feb 16, 2012, 3:57:00 PM2/16/12
to fhem-...@googlegroups.com
Vielen Dank Rudolf.

Buch ist heute angekommen und wird jetzt erstmal durchgelesen :-)

Schlussendlich habe ich es so geschafft:
define BadFensterChecker at +*00:04 {\
  if(ReadingsVal("FHT_1533", "window", "") eq "open") {\

    my $msg = "showdialog -time 5 -text Badfenster offen -header FHEM";;\
    system ("printf '$msg' | nc 192.168.0.7 1450");;\
  }\
}


Danke nochmal!!

Steeeve

unread,
Jul 2, 2012, 7:59:23 AM7/2/12
to fhem-...@googlegroups.com
Und für alle die sich wundern, dass bei ihnen das nicht funktioniert - Window muss groß geschrieben werden (und vermutlich Open auch)!
--> 

define BadFensterChecker at +*00:04 {\
  if(ReadingsVal("FHT_1533", "Window", "") eq "Open") {\

puschel74

unread,
Jul 2, 2012, 10:41:26 AM7/2/12
to fhem-...@googlegroups.com
Hallo,

wenn du fhem im Einsatz hast sollte sich der FHTTK aber auch darüber auslesen lassen.
Dann kannst du dir den Weg über den FHT sparen.
Meine FHTTK am Fenster sind auch einmal mit dem zugehörigen FHT verbunden und einmal in
fhem eingebunden.
Nur die FHTTK an den Türen werden direkt durch fhem abgefragt.

Mit folgendem Schnippsel

my $fhttk_bad_tuer = ReadingsVal("OG_Badezimmer_Tuer", "Window", "nA");;\
my $fhttk_sz_tuer = ReadingsVal("OG_Schlafzimmer_Tuer", "Window", "nA");;\
if(sunrise_abs(7200) gt $now or $now gt sunset_abs(-3600) or ( $fhttk_bad_tuer eq "Closed" and $fhttk_sz_tuer eq "Closed" ) ) {\

prüfe ich ob Badezimmer- und Schlafzimmertür geschlossen sind oder die Uhrzeit innerhalb der Zeitspanne liegt.
Wenn also entweder beide Türen geschlossen sind oder es in der Nacht ist schalte ich das Ganglicht über den
Bewegungsmelder ein.
ACHTUNG! Dies ist nur ein Auszug aus dem Progrämmchen.

Grüße

Steffen

unread,
Jul 8, 2012, 4:38:01 AM7/8/12
to fhem-...@googlegroups.com
Guten Morgen!

Ich hätte da mal auch eine frage aber zu dem Modul Wol und abfrage eines Zustandes, ich möchte das Abgefragt wird ob mein PC im Wol on(true) oder off(false) ist damit der Zustand
am FS20 dummy geändert wird. Was ich bis jetzt versucht hatte war das:
define PcCheck at +*00:01:00 {\
   if(ReadingsVal"DoreenPc","state","off"){\
   fhem("set Pc_Doreen off");;\
  }\
}
aber leider sendet der immer den Befehl off an Fs20Dummy!
Das ist bestimmt ein Fehler und hoffe auf eure Hilfe?!
Mfg Steffen

Steffen

unread,
Jul 8, 2012, 6:50:51 AM7/8/12
to fhem-...@googlegroups.com
Also versuche jetzt schon ne ganze weile aber er schaltet immer den FS20Dummy egal was ich für werte in "DoreenPc","state","off" eintrage, bei WOL steht ja unter "Readings" <isRunning:false> und genau bei diesem Wert soll er den fhem befehl ausführen, wie könnte ich das einbauen???
Mfg Steffen
Reply all
Reply to author
Forward
0 new messages