Hallo,
ich möchte ein notify einrichten, dass Temperatur-, Wind- und "Is Raining"-Daten bei Änderung als Variablen an eine sub (namens repgui) übergibt, die ich in 99_myutils angelegt habe und die diese Daten als Textzeile in das Display eines Fritz Repeater N/G schreibt.
Trotz ausgiebiger Lektüre habe ich große Startschwirigkeiten mit den Notify (oder ist der KS300 vielleicht ein besonders schwierige Fall?)
Bei den Events kommt ein KS300-Reading beispielsweise so an:
2014-06-11 12:44:02 KS300 KS300 temperature: 26.0
Was funktioniert ist eine notify-Def in dieser Form:
KS300.* {repgui("Wetterdaten")}
Wenn ich das Triggere, erscheint der Text "Wetterdaten" im Display des Repeaters.
Mein "missing links" ist aber, wie ich statt dieses Textes die Readings des KS300 übergeben kann. Ich habe es mit $VALUE und $EVENT versucht, aber ohne Erfolg. Das einzige, was ich hinbekommen habe, ist dass mit
KS300.* {repgui($NAME)}
"KS300" im Display erscheint und bei
KS300.* {repgui($TYPE)}
acht Leerzeichen.
Liegt es vielleicht daran, dass die KS300-Werte active Readings sind? Muss ich die Daten evtl. aus der Logfile holen oder vorher in einen Dummy schreiben?
Für eine Initialhilfe wäre ich sehr dankbar.
Viele Grüße
Martin
Zitat von: dadoc am 11 Juni 2014, 13:09:52
Mein "missing links" ist aber, wie ich statt dieses Textes die Readings des KS300 übergeben kann. Ich habe es mit $VALUE und $EVENT versucht, aber ohne Erfolg.
Probiers mal mit ReadingsVal()
RedingsVal hatte ich anhand der Einsteigerdoku auch mal ausprobiert; wäre das in diese Richtung?
KS300:temperature.* {repgui(ReadingsVal("KS300","state","")}
Ich habe das so einmal getriggert, und es wurde "temperature: 27.3 " ins Display geschrieben (obwohl da ja eine Klammer zu wenig ist). Ich kann es aber nicht mehr reproduzieren, d.h. es hat nur einmal funktioniert.
Mein Problem ist ein wenig, dass die Beispiele, die ich finde, meist komplexere if-Abfragen sind, ich aber keines finden konnte, das "einfach" nur die Readings übergibt - habt Ihr einen Tipp?
Das sieht schon richtig aus. Getriggert wird jedesmal wenn KS300 eine neue temperatur liefert. Bist du vielleicht einfach zu ungeduldig? Oder hast du vielleicht ein event-on-change o.ä. aktiv was da vielleicht stört?
Ich hatte ein event-on-update für temperature auf dem KS300 (einer der vielen Versuche gestern...). Ich habe es jetzt gelöscht, aber es tut sich nichts.
Bezüglich der Ungeduld ;) - das notify sollte sich doch manuell mit
trigger KS300
auslösen lassen?
So oder so: Müsste in meine obige DEF nicht noch am Ende eine Klammer, also
KS300:temperature.* {repgui(ReadingsVal("KS300","state",""))}
Tut sich zwar auch nichts, scheint mir aber korrekt.
Und gerade wo ich dies absende, erscheint ein Reading auf dem Display:
T: 29.3 H: 48 W: 3.6 R: 10.7 IR: no Wi: 1
Die doppelte Klammer scheint doch zu wirken...
Mal schauen, ob das nicht auch wieder eine Eintagsfliege war...?
Du musst noch ein Wert mittriggern.....:
http://fhem.de/commandref.html#trigger
Danke - korrekt, obwohl das Triggern vorher komischerweise auch ohne den Wert funktioniert hat.
Was bis eben nicht ging, war das automatische Triggern meines Notify, das ich ja als
KS300:temperature.*
drin hatte, was nach meinem Verständnis korrekt wäre.
Was jetzt geht (d.h. Daten werden bei Änderung aktualisiert) ist dagegen
KS300.*
Das Aufbereiten der etwas unschönen Readings-Zeile macht man wohl am Besten in der Sub?
Vielleicht schreibst du mal die kompletten definitionszeilen, die diesen Vorgang betreffen, ich verliere den Überblick......
define wetten notify KS300.* {repgui(ReadingsVal("KS300","state",""))}
Hallo,
bei ReadingsVal bist du nicht auf state festgenagelt.
Du kannst alle anderen Readings (temperature, wind, etc... ) genauso auslesen und bekommst dann dessen Wert geliefert.
Grüße
Danke, guter Hinweis - das klappt! Jetzt werde ich die nächsten Wochen damit verbingen, den String zusammenzubauen und das Ganze schön zu Formatieren, so in der Art:
24oC --- *** --- WIND: 5,3 --- 34% ---
bzw. wenn der FS20 Regensensor (den ich noch in FHEM einbinden muss) Regen meldet
24oC --- /// --- WIND: 5,3 --- 34% ---
Ich habe es jetzt mit vier Werten eingerichtet:
KS300.* {repgui(ReadingsVal("KS300","temperature",""),ReadingsVal("KS300","wind",""),ReadingsVal("KS300","humidity",""),ReadingsVal("KS300","israining",""))}
wobei das sicher eleganter geht (?).
Die Sub sieht nun so aus:
sub repgui($$$$)
{
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
use LWP::Simple;
my ($Text1,$Text2,$Text3,$Text4) = @_; # Inhalt, der als Lauftext angezeigt werden soll
if ($Text4 eq "no") {
$Text4="\*\*\*";
} else {
my $Text4="---"
}
chomp($Text1);
chomp($Text2);
chomp($Text3);
chomp($Text4);
my $userag = LWP::UserAgent->new;
my $write_text = POST 'http://xxx.xxx.xxx.xxx/cgi-bin/webcm', # IP des Repeater
[
'login:command/password' => 'abcdefghi', ' Passwort des Repeater-Web UI
'errorpage' => '../html/de/menus/menu2.html',
'getpage' => '../html/de/menus/menu2.html',
'nlr:settings/TDS_Timeout' => 300,
'nlr:settings/TDS_ShowMask' => 4095,
'nlr:settings/TDS_Config' => 3,
'nlr:settings/TDS_Orientation' => '0',
'nlr:settings/TDS_ScrollText' => $Text1.' oC --- '.'Wind: '.$Text2.' --- Hum: '.$Text3.' --- '.$Text4,
'time:settings/time' => '1258493499,-60',
'var:errorpagename' => 'infoled',
'var:menu' => 'system',
'var:pagemaster' => '',
'var:pagename' => 'infoled',
'var:pagetitle' => '',
'var:settings/time' => ''
];
$userag->request($write_text);
}
Macht genau, was ich wollte. Muss nur noch den unzuverlässigen Regenerkenner des KS300 gegen den FS20 Regensensor tauschen.
Danke & Grüße
Martin
ReadingsVal() mit state ist in den seltensten Fällen eine gute Idee, weil state eine Besonderheit in fhem darstellt und sich nicht 100% wie ein "normales" reading verhält.
Hallo,
das regexp würde ich schonmal einkürzen.
KS300:(temperature|wind|humidity|israining).*{repgui(ReadingsVal("KS300","temperature",""),ReadingsVal("KS300","wind",""),ReadingsVal("KS300","humidity",""),ReadingsVal("KS300","israining",""))}
Ich hoffe ich hab nichts vergessen.
So wird das notify nur bei den 4 Readings ausgeführt und nicht jedesmal wenn sich was anderes ändert.
checksum wäre z.B. auch so ein Reading das sich bei jeder Übertragung ändert.
Wenn du allerdings bei JEDER Änderung die Werte schreiben willst (auch wenn sich an diesen nichts geändert hat) kannst du es so lassen wie du es hast.
Grüße
Danke, werde ich mal ausprobieren. Allerdings hatte bei mir das Notify auf KS300:temperature.* ja nicht funktioniert.
Der KS300 hätte außer diesen Werten (soweit ich sehe) eh nur noch einen mehr - die Regenmenge.
Hallo,
ZitatAllerdings hatte bei mir das Notify auf KS300:temperature.* ja nicht funktioniert.
das wundert mich.
Bei mir funktioniert
WetterstationEingang_extern:wind.*
einwandfrei.
ZitatDer KS300 hätte außer diesen Werten (soweit ich sehe) eh nur noch einen mehr - die Regenmenge.
Kann sein.
Ich hab für meinen statistics und dewpoint aktiviert - da kommen ein paar Readings mehr zusammen 8)
Grüße