Hauptmenü

Spritmelder

Begonnen von accessburn, 14 Januar 2016, 17:06:52

Vorheriges Thema - Nächstes Thema

accessburn

Huhu,

sieht jemand den Fehler?


define Spritwarnung watchdog Spritwarnung 00:00:02 Spritwarnung set WhatsApp send 49xxxxxx Diesel billig in Nieder-Eschbach
define at_Spritwarnung at +*00:10:00 {\
my $spritpreis = Value("Hessol_NiederEschbach");;\
if ($spritpreis < "0.95");; fhem("trigger Spritwarnung");;\
}


in "Hessol_NiederEschbach" steht "STATE 0.939"
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

kumue

Ich würde 0.95 nicht in Hochkomma setzen, da eine Zahl und kein String
Aber ich muß gestehen, meine Perl-Kenntnisse sind sehr bescheiden...

Reinerlein

Hi Accessburn,

du hast ein If-Statement ohne Ausführungsteil, da du nur ein Semikolon dahinter stehen hast.

Versuch mal folgendes direkt über die Fhemweb-Oberfläche an dem at-Device:
{
  if (Value("Hessol_NiederEschbach") < 0.95) {
    fhem("trigger Spritwarnung");
  }
}
Ich empfehle immer die Klammern zu schreiben, auch wenn du nur ein Statement bedingt ausführen möchtest... das ist übersichtlicher...

Grüße
Reiner

JoWiemann

Hallo,

gibt doch bitte mal die Definition für das Device "Hessol_NiederEschbach", damit wir den Benzinpreis ohne Textzusatz extrahieren können.

PS: Hast Du den Code des "at" aus der fhem.cfg oder aus dem Def-Editor kopiert?

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

accessburn

#4
Sorry, kam jetzt erst dazu zu lesen.

@JoWiemann:
Den Befehl hab ich direkt aus der cfg kopiert.

Hier das device:
define Hessol_NiederEschbach HTTPMOD http://www.clever-tanken.de/tankstelle_details/31889 600
attr Hessol_NiederEschbach userattr readingsExpr_Diesel readingsName_Diesel readingsRegex_Diesel stateFormat timeout
attr Hessol_NiederEschbach alias Hessol Nieder-Eschbach
attr Hessol_NiederEschbach group Spritpreise
attr Hessol_NiederEschbach readingsExpr_Diesel $val + 0.009
attr Hessol_NiederEschbach readingsName_Diesel Diesel
attr Hessol_NiederEschbach readingsRegex_Diesel <span>Diesel</span>[^0-9]+([0-9\.]+)
attr Hessol_NiederEschbach room Information
attr Hessol_NiederEschbach stateFormat Diesel
attr Hessol_NiederEschbach timeout 5
#attr Hessol_NiederEschbach stateFormat Liter_Diesel: Diesel


@kumue:
Oben siehst du das ichdas garnicht mache, hatte das nur zur veranschaulichung in " gesetzt.



EDIT
define Spritwarnung watchdog Spritwarnung 00:00:02 Spritwarnung set WhatsApp send 49xxx Diesel billig in Nieder-Eschbach
define at_Spritwarnung at +*00:10:00 { if (Value("Hessol_NiederEschbach") < 0.99) { fhem("trigger Spritwarnung");; } }


Das scheint erstmal zu funktionieren.

EDIT2
Wenn ich jedoch den Whatsapptext um das Value erweitere wird der Text so gesendet, der Perlteil wird nicht geparst.
Wie macht man denn sowas?

define Spritwarnung watchdog Spritwarnung 00:00:02 Spritwarnung set WhatsApp send 49xxx Diesel billig in Nieder-Eschbach: { Value("Hessol_NiederEschbach" } €
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

Reinerlein

Hallo accessburn,

die Value-Anweisung liefert dir den Inhalt von STATE zurück. Du möchtest ja aber eigentlich den Inhalt des Readings "Diesel" prüfen und versenden. Das hatte ich in meinem Beispiel übersehen...

Das geht dann so:

define at_Spritwarnung at +*00:10:00 { my $diesel = ReadingsVal("Hessol_NiederEschbach", "Diesel", 100);; if ($diesel < 0.99) { fhem("trigger Spritwarnung");; } }
Die 100 soll nur sicherstellen, dass bei einem fehlerhaften Readingswert (bzw. wenn er gar nicht vorhanden ist), ständig Nachrichten abgesetzt werden. Die Zahl muss eigentlich nur größer als dein Prüfwert sein...

Für deine eigentliche Meldung müsstest du mal den Code posten, wo die Ersetzung erfolgen soll. Prinzipiell musst du dich bei Notify o.ä. Konstrukten einmal entscheiden: Nur "Fhem"-Befehle oder nur Perl. Die geschweiften Klammern leiten einen Nur-Perl-Teil ein.
Es gibt aber auch seit neuestem eine Variante, um vereinfacht auf Readings innerhalb von Fhem-Befehlen zugreifen zu können. Da kenne ich mich aber nicht so gut aus...

Grüße
Reiner

accessburn

Ach stimmt ... Readingsval und value, mensch. Das kapiere ich nie.
Ist schwer das PHP-Wissen abzustellen, da hat ein String nur seinen Wert, nicht noch einen Status. Danke für den Tip.

Mit dem Meldungsteil-code meinst du das Whatsapp gedöns?
define WhatsApp yowsup
attr WhatsApp userattr allowedCommands commandPrefix
attr WhatsApp cmd /home/pi/yowsup-master/yowsup-cli demos -c /home/pi/yowsup-config/yowsup.config --yowsup
attr WhatsApp commandPrefix fhem
attr WhatsApp group Whatsapp
attr WhatsApp home PWD
attr WhatsApp icon it_i-net
define 49xxx yowsup 49xxx
attr 49xxx userattr allowedCommands commandPrefix
attr 49xxx group Whatsapp
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

deltaac

Könnte man das ganze nicht dynamisch gestalten und eine Info schicken,  wenn z.B. der Preis 10% günstiger als der Durchschnitt der letzten 3 Tage?

accessburn

Klingt geil, aber übersteigt meinen Wissenstand um Jahre  ;D
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

Reinerlein

Hi accessburn,

ich meinte das Device "Spritwarnung", habe aber eben gesehen, dass du das schon gepostet hattest...
Dort musst du dir den Diesel-Wert auch nochmal holen:

define Spritwarnung watchdog Spritwarnung 00:00:02 Spritwarnung { my $diesel = ReadingsVal("Hessol_NiederEschbach", "Diesel", 100);; fhem("set WhatsApp send 49xxx Diesel nur $diesel € in Nieder-Eschbach");; }


Das ganze Konstrukt kannst du dir aber auch in ein DOIF reinpacken:

define Sprit DOIF ([Hessol_NiederEschbach:Diesel] < 0.99) ( fhem("set WhatsApp send 49xxx Diesel nur [Hessol_NiederEschbach:Diesel]€ in Nieder-Eschbach"); )
Das ganze nur aus dem Kopf :) Da bekommst du bei jeder Spritmeldung kleiner 0.99 eine neue Nachricht. Das kannst du dann noch mit Attributen beeinflussen...

Grüße
Reiner