<gelöst> DOIF mit Verkehrsmeldung (GoogleMaps) und TelegramBot

Begonnen von Albi, 20 Februar 2019, 19:18:32

Vorheriges Thema - Nächstes Thema

Albi

Hallo zusammen,

ich habe mir das Modul TelegramBot erfolgreich eingerichtet. Ich kann nun Nachrichten empfangen und schreiben. Also funktioniert in beide Richtungen.


Nun habe ich mir ein Fahrzeit eingerichtet in der Via GoogleMaps der aktuelle Verkehr auf meiner Strecke entsprechend angezeigt wird. Mache ich über HTTMOD
Hier habe ich nun das Reading Verkehr 54 Minuten

Nun habe ich ein DOIF angelegt das auf die Fahrzeit reagieren soll und eben eine Nachricht an Telegram schicken soll. Momentan schickt das DOIF aber eben nur wenn die Fahrzeit genau 54 Minuten entspricht. Eine Verkehrslage mit mehr als einer Stunde wird im Reading wie folgt angezeigt: Verkehr 1 Stunde, 5 Minuten

Mein aktuelles DOIF reagiert eben nun "nur" bei 54 Minuten. Das habe ich erfolgreich getestet.
defmod Fahrzeit_GZ_DOIF_1 DOIF ([Fahrzeit_GZ:"Verkehr: 54 Minuten"]) (set telebot message Starker Verkehr nach G******)
attr Fahrzeit_GZ_DOIF_1 cmdpause 3
attr Fahrzeit_GZ_DOIF_1 do always
attr Fahrzeit_GZ_DOIF_1 room Telegram,Verteilung



ABER, nun möchte ich aber, dass jenes DOIF eben nur reagiert, wenn die Fahrzeit mehr als 1 Stunde beträgt. Wie änder ich das im DOIF nun ab??

Zudem möchte ich dann noch ein DOELSE einbauen, das eben bei unter 58 Minuten eine Nachricht mit (set telebot message Normaler Verkehr nach G******) sendet.

Für Hilfe wäre ich sehr dankbar.

Gruß Albi


Fhem Raspberry3+

TabletUI mit Abfallkalender, der auch per Telegramm sendet - Verkehrsmeldung über Google, das per DOIF an Telegramm bei Störung meldet - Sonnoff mit Tasmota (mqtt) und Shelly (mqtt und mqtt2) - Alexa Verknüpfung - Benzinpreis auf Tablet UI über HTTPMOD - Wetter + Pollen

Albi

Nachdem ich nun lange versucht habe es hinzubekommen, habe ich einen anderen Weg gewählt.

Ich habe mich mit einem DUMMY Device und 2 DOIF beholfen.

Erstes DOIF zum ermitteln der aktuellen Situation, also das abfragen des Reading von dem HTTMOD welches dann das Dummy Device schaltet.


defmod Fahrzeit_GZ_DOIF_1 DOIF (([Fahrzeit_GZ:"Verkehr: 54 Minuten"]) or\
([Fahrzeit_GZ:"Verkehr: 55 Minuten"]) or \
([Fahrzeit_GZ:"Verkehr: 56 Minuten"]) or \
([Fahrzeit_GZ:"Verkehr: 57 Minuten"]) or \
([Fahrzeit_GZ:"Verkehr: 58 Minuten"]) or \
([Fahrzeit_GZ:"Verkehr: 59 Minuten"])) (set Nach_GZ ON) \
DOELSE ([Fahrzeit_GZ:"Verkehr: 1 Stunde"]) (set Nach_GZ OFF)
attr Fahrzeit_GZ_DOIF_1 do always
attr Fahrzeit_GZ_DOIF_1 room Fahrzeit



Und ein weiteres DOIF das dann entsprechend dem "Status" des Dummy Device den Befehl an TelegramBot sendet. Hier habe ich das "attr do always" rausgelassen. Damit eben nicht bei jedem mal abfragen des HTTMOD eine Nachricht kommt. Es kommt jetzt also nur eine Nachricht wenn sich der Status des Dummy Device Ändert.

defmod GZ_Verkehr_Telebot DOIF ([Nach_GZ] eq "ON"  and [?07:30-23:00]) (set telebot message Fahrzeit nach G****** ist Normal) \
DOELSE ([Nach_GZ] eq "OFF" and [?07:30-23:00]) (set telebot message ACHTUNG Fahrzeit nach G****** ist über eine Stunde!!)
attr GZ_Verkehr_Telebot cmdpause 3
attr GZ_Verkehr_Telebot room Fahrzeit



Und hier das Dummy Device

defmod Nach_GZ dummy
attr Nach_GZ eventMap on:ON off:OFF
attr Nach_GZ room Fahrzeit
attr Nach_GZ webCmd on:off



So konnte ich es jetzt umsetzen. Allerdings habe ich halt das Glück, dass bei freier Strecke die Fahrzeit unter einer Stunde liegt und ich so das im DOIF eben eintragen konnte (55-59 Minuten) und im DOELSE dann eben auf die Stunden reagiere.
Leider habe ich es anders nicht hinbekommen. Aber mir hilft es gerade erst mal so. Vielleicht fällt ja nch jemanden eine bessere Lösung ein das Reading aus dem HTTMOD besser zu nutzen.


Gruß Albi





Fhem Raspberry3+

TabletUI mit Abfallkalender, der auch per Telegramm sendet - Verkehrsmeldung über Google, das per DOIF an Telegramm bei Störung meldet - Sonnoff mit Tasmota (mqtt) und Shelly (mqtt und mqtt2) - Alexa Verknüpfung - Benzinpreis auf Tablet UI über HTTPMOD - Wetter + Pollen

Damian

Wenn Verkehr ein Reading ist, dann ist es besser das Reading abzufragen

z. B.

defmod Fahrzeit_GZ_DOIF_1 DOIF ([Fahrzeit_GZ:Verkehr:d] <59 and [Fahrzeit_GZ:Verkehr:d] >54  ) (set Nach_GZ ON)

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

Albi

Hallo

Ja so habe ich auch gedacht es zu lösen. Aber mein Reading gibt mir leider keine Ziffer aus sondern Ziffern und Text

Aber mein HTTPMOD sieht wie folgt aus

defmod Fahrzeit_GZ HTTPMOD https://maps.googleapis.com/maps/api/distancematrix/json?origins=FroehlinserStrasse25,Ottobeuren,Deutschland&destinations=Rebaystrasse11,Guenzburg,Deutschland&mode=driving&language=de-DE&departure_time=now&key=AIzaSyBJxWWuMDH-uMhWJmvDCJAtn7n9-bdzQq4 900
attr Fahrzeit_GZ userattr reading01Name reading01OExpr reading01Regex reading02Name reading02OExpr reading02Regex
attr Fahrzeit_GZ alias Fahrzeit Günzburg
attr Fahrzeit_GZ enableControlSet 1
attr Fahrzeit_GZ reading01Name Standard
attr Fahrzeit_GZ reading01Regex (?s)duration.* "(.* Minuten).*duration_in_traffic
attr Fahrzeit_GZ reading02Name Verkehr
attr Fahrzeit_GZ reading02Regex (?s)duration_in_traffic.*"(.* Minuten)
attr Fahrzeit_GZ room Fahrzeit
attr Fahrzeit_GZ stateFormat Normal:Standard <br> Aktuell:Verkehr


und das Reading wird wie folgt aus gegeben:

Readings
Standard 57 Minuten 2019-02-21 21:27:39
Verkehr 54 Minuten 2019-02-21 21:27:39


Oder halt dann mit "Stunden"

Readings
Standard 1 Stunde 7 Minuten 2019-02-21 21:27:39
Verkehr 1 Stunde 10 Minuten 2019-02-21 21:27:39


Und das mit den "Stunden" und "Minuten" bereitet mir eben die Probleme. Ein DOIF mit einem Zahlenwert mit "><=" zu erarbeiten habe ich schon öfters gemacht. MEin Problem ist eben das Reading, indem auch ein Text wie Stunde und Minuten dazukommt. Wobei ich auch damit leben könnte den STATE des HTTMOD ohne "Minuten" und "Stunden" ausgeben zu lassen. Traue mich aber nicht an das HTTMOD Device ran um da was zu ändern. Bin ja doch nur ein Anfänger in FHEM. Und wie ich immer sage "Never touch a running System"

Also abschließend. Ich wäre bereit das HTTMOD so zu ändern, dass nur Zahlen als Reading kommen. Mir reicht auch die Zeit nur für den "Verkehr". Das "Normal" ist ein Nice to have, aber nicht unbedingt benötigt. Nur ich weiß eben nicht wo ich dort Hand anlegen kann/muss.


Gruß Albi
 
Fhem Raspberry3+

TabletUI mit Abfallkalender, der auch per Telegramm sendet - Verkehrsmeldung über Google, das per DOIF an Telegramm bei Störung meldet - Sonnoff mit Tasmota (mqtt) und Shelly (mqtt und mqtt2) - Alexa Verknüpfung - Benzinpreis auf Tablet UI über HTTPMOD - Wetter + Pollen

Damian

#4
Zitat von: Albi am 21 Februar 2019, 21:52:06
Ja so habe ich auch gedacht es zu lösen. Aber mein Reading gibt mir leider keine Ziffer aus sondern Ziffern und Text

Na und, was meinst du warum ich das d angehängt hatte ;)

Zur Not kann man auch noch genauer filtern:  https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Albi

Ok, Danke.

Scheint, als ich es so versucht hatte mit dem ":d" hatte ich wohl einen Fehler. Danke so klappt es.

Jedoch, wie händel ich es das mein Dummy Device wieder bei einer Fahrtzeit von 1 Stunde und 7 Minuten auf OFF gestellt wird?

Habe mir mal Testweise ein neues HTTPMOD mit einer Fahrtstrecke über eine Stunde eingerichtet und ein Test Dummy und eben ein Test DOIF

defmod Fahrzeit_Stunde_Test DOIF ([Fahrzeit_Test:Verkehr:d] <1,5) (set Fahrt_Test ON)

Aber das passt leider nicht...

Das Reading sieht so aus

Verkehr 1 Stunde, 8 Minuten 2019-02-22 08:30:53


Für Hilfe wäre ich sehr dankbar....
Fhem Raspberry3+

TabletUI mit Abfallkalender, der auch per Telegramm sendet - Verkehrsmeldung über Google, das per DOIF an Telegramm bei Störung meldet - Sonnoff mit Tasmota (mqtt) und Shelly (mqtt und mqtt2) - Alexa Verknüpfung - Benzinpreis auf Tablet UI über HTTPMOD - Wetter + Pollen

kleineslichtHH

Schau dir mal das Traffic Modul an, vielleicht ist das eine Alternative.

dort bekommst du passende Readings


READINGS:
     2019-02-22 09:48:00   alternatives    A1 - 43 Minuten
     2019-02-22 08:39:00   average_delay_min 1.5
     2019-02-22 09:48:00   average_duration_in_traffic_min 43
     2019-02-22 09:48:00   average_duration_min 44
     2019-02-22 09:48:00   delay           0 min
     2019-02-22 09:48:00   delay_min       0
     2019-02-22 09:48:00   distance        41,1 km
     2019-02-22 09:48:00   duration        44 Minuten
     2019-02-22 09:48:00   duration_in_traffic 43 Minuten
     2019-02-22 09:48:00   duration_in_traffic_min 43
     2019-02-22 09:48:00   duration_min    44
     2019-02-22 09:48:00   eta             10:30:57
     2019-02-22 09:48:00   return_alternatives A1 - 47 Minuten
     2019-02-22 09:48:00   return_average_delay_min 1.5
     2019-02-22 09:48:00   return_average_duration_in_traffic_min 45
     2019-02-22 09:48:00   return_average_duration_min 44.5
     2019-02-22 09:48:00   return_delay    1 min
     2019-02-22 09:48:00   return_delay_min 2
     2019-02-22 09:48:00   return_distance 41,9 km
     2019-02-22 09:48:00   return_duration 45 Minuten
     2019-02-22 09:48:00   return_duration_in_traffic 47 Minuten
     2019-02-22 09:48:00   return_duration_in_traffic_min 47
     2019-02-22 09:48:00   return_duration_min 45
     2019-02-22 09:48:00   return_eta      10:34:56
     2019-02-22 09:48:00   return_state    OK
     2019-02-22 09:48:00   return_status   OK
     2019-02-22 09:48:00   return_summary  A1
     2019-02-22 09:48:00   state           OK
     2019-02-22 09:48:00   status          OK
     2019-02-22 09:48:00   summary         A1

Damian

Die Zeitangaben sind für den Menschen vielleicht gut lesbar, aber schlecht für die Auswertung. Wenn du es im HTTPMOD nicht vereinfachen kannst, dann kannst du meinem vorherigen Link folgen und mit einer guten Portion RegEx-Wissen, die Zeitangabe auswerten und in Minuten umrechnen.

z. B.

DOIF ([Fahrzeit_Test:Verkehr:"^(?:(.*) Stunde)?(.*) Minuten":$1*60+$2] < 90) (...)

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

Albi

@kleineslichtHH

Danke, das schaue ich mir mal genauer an.


@Damian

Danke für den Denkanstoss. Ich habe es hinbekommen. Es sieht nun wie folgt aus und funktioniert auch. Das "," Nach den "Stunden" hatte mich noch ein wenig geärgert. Aber nun habe ich es hinbekommen. Danke für die Hilfe

DOIF ([Fahrzeit_Test:Verkehr:"^(?:(.*) Stunde,.)?(.*) Minuten":$1*60+$2] > 65) (set FahrtTest ON)

Nun wird bei einer Fahrtzeit von Verkehr über 65 Minuten, also 1 Stunde, 5 Minuten das Dummy auf ON geschaltet. Super so kann ich das nun in mein DOIF einbauen.


Gruß Albi
Fhem Raspberry3+

TabletUI mit Abfallkalender, der auch per Telegramm sendet - Verkehrsmeldung über Google, das per DOIF an Telegramm bei Störung meldet - Sonnoff mit Tasmota (mqtt) und Shelly (mqtt und mqtt2) - Alexa Verknüpfung - Benzinpreis auf Tablet UI über HTTPMOD - Wetter + Pollen

Albi

Habe jetzt noch "TelegramBot" mit eingebaut

COOL

schreibt mir jetzt über DOIF auch ans Handy die Verkehrslage.

Auch an eine Gruppe in Telegramm. Geht auch. Dank diesem Forum... Board Suche hat mir da geholfen....
Fhem Raspberry3+

TabletUI mit Abfallkalender, der auch per Telegramm sendet - Verkehrsmeldung über Google, das per DOIF an Telegramm bei Störung meldet - Sonnoff mit Tasmota (mqtt) und Shelly (mqtt und mqtt2) - Alexa Verknüpfung - Benzinpreis auf Tablet UI über HTTPMOD - Wetter + Pollen

FHEM-User22

Hallo an alle,

Zitat von: Albi am 21 Februar 2019, 21:52:06

Aber mein HTTPMOD sieht wie folgt aus

defmod Fahrzeit_GZ HTTPMOD https://maps.googleapis.com/maps/api/distancematrix/json?origins=FroehlinserStrasse25,Ottobeuren,Deutschland&destinations=Rebaystrasse11,Guenzburg,Deutschland&mode=driving&language=de-DE&departure_time=now&key=AIzaSyBJxWWuMDH-uMhWJmvDCJAtn7n9-bdzQq4 900
attr Fahrzeit_GZ userattr reading01Name reading01OExpr reading01Regex reading02Name reading02OExpr reading02Regex
attr Fahrzeit_GZ alias Fahrzeit Günzburg
attr Fahrzeit_GZ enableControlSet 1
attr Fahrzeit_GZ reading01Name Standard
attr Fahrzeit_GZ reading01Regex (?s)duration.* "(.* Minuten).*duration_in_traffic
attr Fahrzeit_GZ reading02Name Verkehr
attr Fahrzeit_GZ reading02Regex (?s)duration_in_traffic.*"(.* Minuten)
attr Fahrzeit_GZ room Fahrzeit
attr Fahrzeit_GZ stateFormat Normal:Standard <br> Aktuell:Verkehr



kann mir jemand helfen, die https://maps.googleapis.com/maps/...... zu erstellen? Ich komme nicht weiter, meine Fahrstrecke einzustellen.

Dankeschön.
FHEM auf Raspberry Pi und Proxmox und... und.... und....

Albi

Fhem Raspberry3+

TabletUI mit Abfallkalender, der auch per Telegramm sendet - Verkehrsmeldung über Google, das per DOIF an Telegramm bei Störung meldet - Sonnoff mit Tasmota (mqtt) und Shelly (mqtt und mqtt2) - Alexa Verknüpfung - Benzinpreis auf Tablet UI über HTTPMOD - Wetter + Pollen

Per

Zitat von: Damian am 22 Februar 2019, 10:17:13und mit einer guten Portion RegEx-Wissen, die Zeitangabe auswerten und in Minuten umrechnen
Wäre es nicht besser, das beim Quellobjekt als Userreading zu machen?

Damian

Zitat von: Per am 25 Februar 2019, 15:54:40
Wäre es nicht besser, das beim Quellobjekt als Userreading zu machen?

Kann man machen, aber auch da ist eine gute Portion RegEx-Wissen von Vorteil.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Die RegEx wird die gleiche sein (da also keine Erleichterung), die Syntax sogar ohne DOIF-Erleichterung.
Ist auch mehr eine Philosophiefrage bzw. wie oft ich das Ergebnis brauche.