Garagentor Zustand erweitern mit DOIF Perl für push messages

Begonnen von der-Lolo, 04 November 2018, 19:53:27

Vorheriges Thema - Nächstes Thema

der-Lolo

An meinem Garagentor habe ich Endschalter angebracht, ich erfasse also geschlossen und offen.
Ich habe mir ein DOIF gebastelt welches mir den Zustand des Tores meldet.
bzw in der GUI visualisiert...

Internals:
   DEF        ([GarageDoor] eq "on" and [?TorZu] eq "on") ()
DOELSEIF ([GarageDoor] eq "on" and [?TorOffen] eq "on") ()
DOELSEIF ([TorOffen] eq "on") ()
DOELSEIF ([TorZu] eq "on") ()
DOELSE ()
   MODEL      FHEM
   NAME       GAstateView
   NR         130
   NTFY_ORDER 50-GAstateView
   STATE      geschlossen
   TYPE       DOIF
   Helper:
     DBLOG:
       cmd:
         DbLog:
           TIME       1541351125.79441
           VALUE      4
       cmd_event:
         DbLog:
           TIME       1541351125.79441
           VALUE      TorZu
       cmd_nr:
         DbLog:
           TIME       1541351125.79441
           VALUE      4
       state:
         DbLog:
           TIME       1541351125.79441
           VALUE      geschlossen
       wait_timer:
         DbLog:
           TIME       1541351125.78937
           VALUE      no timer
   READINGS:
     2018-11-04 18:05:25   Device          TorZu
     2018-11-04 18:05:25   cmd             4
     2018-11-04 18:05:25   cmd_event       TorZu
     2018-11-04 18:05:25   cmd_nr          4
     2018-11-04 18:05:07   e_GarageDoor_STATE off
     2018-11-04 18:05:07   e_TorOffen_STATE off
     2018-11-04 18:05:25   e_TorZu_STATE   on
     2018-10-08 20:36:38   mode            enabled
     2018-11-04 18:05:25   state           geschlossen
     2018-11-04 18:05:25   wait_timer      no timer
   Regex:
   attr:
     cmdState:
       0:
         öffnet
       1:
         schliesst
       2:
         geöffnet
       3:
         geschlossen
       4:
         undefiniert
     wait:
       0:
         0
       1:
         0
       2:
         0
       3:
         0
       4:
         20.5
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'GarageDoor','STATE') eq "on" and ::InternalDoIf($hash,'TorZu','STATE') eq "on"
     1          ::InternalDoIf($hash,'GarageDoor','STATE') eq "on" and ::InternalDoIf($hash,'TorOffen','STATE') eq "on"
     2          ::InternalDoIf($hash,'TorOffen','STATE') eq "on"
     3          ::InternalDoIf($hash,'TorZu','STATE') eq "on"
   devices:
     0           GarageDoor
     1           GarageDoor
     2           TorOffen
     3           TorZu
     all         GarageDoor TorOffen TorZu
   do:
     0:
       0         
     1:
       0         
     2:
       0         
     3:
       0         
     4:
       0         
   helper:
     event      on
     globalinit 1
     last_timer 0
     sleepdevice TorOffen
     sleepsubtimer 0
     sleeptimer -1
     timerdev   TorZu
     timerevent on
     triggerDev TorZu
     DOIF_eventas:
       cmd_nr: 4
       cmd: 4
       cmd_event: TorZu
       state: geschlossen
     bm:
       DOIF_Get:
         cnt        2
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        04.11. 19:39:20
         max        2.59876251220703e-05
         tot        4.69684600830078e-05
         mAr:
           HASH(0x5994270)
           GAstateView
           ?
       DOIF_Notify:
         cnt        821079
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        01.11. 17:43:11
         max        0.0163497924804688
         tot        48.1434075832367
         mAr:
           HASH(0x5994270)
           HASH(0x5993c28)
       DOIF_Set:
         cnt        43
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        04.11. 17:10:54
         max        9.79900360107422e-05
         tot        0.00229549407958984
         mAr:
           HASH(0x5994270)
           GAstateView
           ?
     timerevents:
       on
     timereventsState:
       state: on
     triggerEvents:
       on
     triggerEventsState:
       state: on
   internals:
     0           GarageDoor:STATE TorZu:STATE
     1           GarageDoor:STATE TorOffen:STATE
     2           TorOffen:STATE
     3           TorZu:STATE
     all         GarageDoor:STATE TorZu:STATE TorOffen:STATE
   itimer:
   perlblock:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      Zustand Garagentor
   cmdState   öffnet|schliesst|geöffnet|geschlossen|undefiniert
   room       11-Garage
   wait       0:0:0:0:20.5


Es wird oft vergessen die Garage wieder zu schliessen.
Wenn der Zustand offen oder undefiniert länger als 10 minuten anliegt, würde ich gerne eine Push Nachricht schicken sodass wir daran erinnert werden das Tor zu schliessen - am liebsten würde ich noch versuchen zu erkennen wer das Tor offen gelassen hat und die push message via Residents passend Adressieren, aber das ist erstmal nebensache.
Auch wegen der nebensache würde ich gerne in den Perl Modus wechseln...


Ich fand den Schnipsel mit DOIF Perl

Zitat von: Damian am 27 September 2018, 18:50:50
Neue Version eingecheckt: Funktionen: set_Timer, get_Timer, del_Timer sind rausgeflogen, Commandref zum Perl-Modus wurde überarbeitet

Edit: Beispiel zum Melden geöffneter Fenster wurde in der Commandref von set_Timer auf set_Exec umgestellt (ist sogar kürzer geworden :) )

Verzögerte Fenster-offen-Meldung mit Wiederholung für mehrere Fenster:

define di_window DOIF
subs {
  sub logwin {                                       # Definition der Funkton namens "logwin"
    my ($window)=@_;                                 # übernehme Parameter in die Variable $window
    Log 3,"Fenster offen, bitte schließen: $window"; # protokolliere Fenster-Offen-Meldung
    set_Exec ("$window",1800,"logwin",$window);      # setze Timer auf 30 Minuten für eine wiederholte Meldung
  }
}
{ if (["_window$:open"]) {set_Exec ("$DEVICE",600,'logwin("$DEVICE")')}} # wenn, Fenster geöffnet wird, dann setze Timer auf Funktion zum Loggen namens "logwin"
{ if (["_window$:closed"]) {del_Exec ("$DEVICE")}}                       # wenn, Fenster geschlossen wird, dann lösche Timer



aber wie verknote ich nun DOIF mit DOIF Perl...?
Ich steh ein bisschen auf dem schlauch.


Damian

Nur zu, das Beispiel ist ein guter Ausgangspunkt dafür, alles, was du brauchst ist dokumentiert. Fang einfach an und dann schauen wir weiter.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Ähm - ich hänge schon bei den ersten versuchen...

fhem_msg statt fhem_set wird nicht akzeptiert.

PERL WARNING: String found where operator expected at (eval 146095) line 4, near "fhem_msg "push @rr_Michael schläft...""

Damian

Gibt es den Befehl fhem_msg überhaupt - ich kenne ihn nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

der befehl lautet msg

msg push @rr_Michael Hier steht die Nachricht

in der Eingabezeile sendet eine push Nachricht per Telegram an den Bewohner Michael

Damian

Zitat von: der-Lolo am 11 November 2018, 12:21:52
der befehl lautet msg

msg push @rr_Michael Hier steht die Nachricht

in der Eingabezeile sendet eine push Nachricht per Telegram an den Bewohner Michael

Ich habe nur für den häufigen FHEM-set-Befehl die Perlfunktion fhem_set definiert, für alle anderen FHEM-Befehle benutzt man fhem("..."), hier also fhem("msg..."). So steht es auch in der DOIF-Doku.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo


der-Lolo

Hallo Damian,
ich hatte mich da wohl etwas zu früh gefreut - Zueerst wurde @rr_Michael angemeckert - ich habe dann mit einem Backslash das @ escaped - die Garagesache ist mir nicht so dringlich wie das DOIF welches ich als "WPmsgAdjust" getauft habe.

Ich möchte einige Meldungen der Wärmepumpe per Push weiterleiten - hieraus ist das hier entstanden.

Internals:
   DEF        subs {
  sub push {
    my ($message,$status)=@_;
    fhem("msg push \@Eichenheim $message");
    set_State "$status";
  }
}
{ if ([mF_WMZ:Durchfluss:d] < 1 and [WH2600:temperature:d] < 5) {
    push ("kein Wasserdurchfluss mehr und Frost!","critical Alarm sent");
  }
}
   MODEL      Perl
   NAME       WPmsgAdjust
   NR         184
   NTFY_ORDER 50-WPmsgAdjust
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-11-14 20:47:33   Device          WH2600
     2018-11-14 20:47:33   block_01        condition c01: Type of arg 1 to push must be array (not constant item),"

     2018-11-14 20:47:33   e_WH2600_temperature 4.8
     2018-11-14 20:47:14   e_mF_WMZ_Durchfluss 1031
     2018-11-14 20:45:43   mode            enabled
     2018-11-03 20:40:20   state           initialized
     2018-11-14 20:47:33   warning         condition c01: Ambiguous call resolved as CORE::push(), qualify as such or use &

   Regex:
   condition:
     0           if (::ReadingValDoIf($hash,'mF_WMZ','Durchfluss','','d') < 1 and ::ReadingValDoIf($hash,'WH2600','temperature','','d') < 5) {
    push ("kein Wasserdurchfluss mehr und Frost!","critical Alarm sent");
  }

   devices:
     0           mF_WMZ WH2600
     all         mF_WMZ WH2600
   helper:
     event      pressure: 1016.20,luminosity: 0.00,dewpoint_f: 40.5,wind_gust_mph: 0.0,rain_day: 0.3,rain_day_in: 0.01,temperature_f: 40.6,wind_speed_mps: 0.0,rain_year: 25.2,pressureAbs_in: 30.28,rain: 0.0,wind_gust: 0.0,rain_in: 0.00,humidity: 99,wind_speed_mph: 0.0,wind_gust_mps: 0.0,wind_chill_f: 40.6,dewpoint: 4.7,indoorTemperature_f: 67.5,wind_chill: 4.8,indoorHumidity: 62,rain_month_in: 0.47,rain_week: 8.7,rain_month: 12.0,rain_week_in: 0.34,wind_speed: 0.0,pressure_in: 30.01,pressureAbs: 1025.30,indoorTemperature: 19.7,temperature: 4.8,wind_direction: 187,rain_year_in: 0.99,solarradiation: 0.00,UV: 0,UVR: 0,pressure_mm: 7.6,pressureAbs_mm: 7.7,indoorDewpoint: 12.2,indoorDewpoint_f: 57.1,humidityAbs: 6.6,humidityAbs_f: 52.0,indoorHumidityAbs: 10.5,indoorHumidityAbs_f: 110.9,wind_compasspoint: S,wind_speed_bft: 0,wind_speed_kn: 0.0,wind_speed_fts: 0.0,wind_gust_bft: 0,wind_gust_kn: 0.0,wind_gust_fts: 0.0,
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev WH2600
     bm:
       DOIF_Get:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        14.11. 20:46:15
         max        2.19345092773438e-05
         tot        2.19345092773438e-05
         mAr:
           HASH(0x7206cf0)
           WPmsgAdjust
           ?
       DOIF_Notify:
         cnt        97
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        14.11. 20:47:08
         max        0.00238800048828125
         tot        0.0234441757202148
         mAr:
           HASH(0x7206cf0)
           HASH(0x70c6c28)
       DOIF_Set:
         cnt        4
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        14.11. 20:45:43
         max        5.50746917724609e-05
         tot        0.000174283981323242
         mAr:
           HASH(0x7206cf0)
           WPmsgAdjust
           ?
     triggerEvents:
       pressure: 1016.20
       luminosity: 0.00
       dewpoint_f: 40.5
       wind_gust_mph: 0.0
       rain_day: 0.3
       rain_day_in: 0.01
       temperature_f: 40.6
       wind_speed_mps: 0.0
       rain_year: 25.2
       pressureAbs_in: 30.28
       rain: 0.0
       wind_gust: 0.0
       rain_in: 0.00
       humidity: 99
       wind_speed_mph: 0.0
       wind_gust_mps: 0.0
       wind_chill_f: 40.6
       dewpoint: 4.7
       indoorTemperature_f: 67.5
       wind_chill: 4.8
       indoorHumidity: 62
       rain_month_in: 0.47
       rain_week: 8.7
       rain_month: 12.0
       rain_week_in: 0.34
       wind_speed: 0.0
       pressure_in: 30.01
       pressureAbs: 1025.30
       indoorTemperature: 19.7
       temperature: 4.8
       wind_direction: 187
       rain_year_in: 0.99
       solarradiation: 0.00
       UV: 0
       UVR: 0
       pressure_mm: 7.6
       pressureAbs_mm: 7.7
       indoorDewpoint: 12.2
       indoorDewpoint_f: 57.1
       humidityAbs: 6.6
       humidityAbs_f: 52.0
       indoorHumidityAbs: 10.5
       indoorHumidityAbs_f: 110.9
       wind_compasspoint: S
       wind_speed_bft: 0
       wind_speed_kn: 0.0
       wind_speed_fts: 0.0
       wind_gust_bft: 0
       wind_gust_kn: 0.0
       wind_gust_fts: 0.0
       
     triggerEventsState:
       pressure: 1016.20
       luminosity: 0.00
       dewpoint_f: 40.5
       wind_gust_mph: 0.0
       rain_day: 0.3
       rain_day_in: 0.01
       temperature_f: 40.6
       wind_speed_mps: 0.0
       rain_year: 25.2
       pressureAbs_in: 30.28
       rain: 0.0
       wind_gust: 0.0
       rain_in: 0.00
       humidity: 99
       wind_speed_mph: 0.0
       wind_gust_mps: 0.0
       wind_chill_f: 40.6
       dewpoint: 4.7
       indoorTemperature_f: 67.5
       wind_chill: 4.8
       indoorHumidity: 62
       rain_month_in: 0.47
       rain_week: 8.7
       rain_month: 12.0
       rain_week_in: 0.34
       wind_speed: 0.0
       pressure_in: 30.01
       pressureAbs: 1025.30
       indoorTemperature: 19.7
       temperature: 4.8
       wind_direction: 187
       rain_year_in: 0.99
       solarradiation: 0.00
       UV: 0
       UVR: 0
       pressure_mm: 7.6
       pressureAbs_mm: 7.7
       indoorDewpoint: 12.2
       indoorDewpoint_f: 57.1
       humidityAbs: 6.6
       humidityAbs_f: 52.0
       indoorHumidityAbs: 10.5
       indoorHumidityAbs_f: 110.9
       wind_compasspoint: S
       wind_speed_bft: 0
       wind_speed_kn: 0.0
       wind_speed_fts: 0.0
       wind_gust_bft: 0
       wind_gust_kn: 0.0
       wind_gust_fts: 0.0
       state:
   internals:
   itimer:
   perlblock:
     0         
   readings:
     0           mF_WMZ:Durchfluss WH2600:temperature
     all         mF_WMZ:Durchfluss WH2600:temperature
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   room       90-Testumgebung,96-Wärmepumpe


Im block_01 steht nun -

condition c01: Type of arg 1 to push must be array (not constant item),"

Unter Warning steht -

condition c01: Ambiguous call resolved as CORE::push(), qualify as such or use &

Im Log findet sich -

2018.11.14 20:46:04 3: eval: WPmsgAdjust: warning in condition c01
2018.11.14 20:46:04 1: PERL WARNING: Ambiguous call resolved as CORE::push(), qualify as such or use & at (eval 105547) line 2.
2018.11.14 20:45:48 3: eval: WPmsgAdjust: warning in condition c01
2018.11.14 20:45:48 1: PERL WARNING: Ambiguous call resolved as CORE::push(), qualify as such or use & at (eval 105541) line 2.
2018.11.14 20:45:44 3: eval: WPmsgAdjust: warning in condition c01
2018.11.14 20:45:44 1: PERL WARNING: Ambiguous call resolved as CORE::push(), qualify as such or use & at (eval 105527) line 2.
2018.11.14 20:43:02 1: PERL WARNING: Possible unintended interpolation of @Eichenheim in string at (eval 105332) line 4.


Wie kann ich aus DOIF Perl eine push Nachricht senden?

Damian

Offenbar gibt es push schon in
ZitatCORE::push()
.

Entweder benennst du deine Funktion um oder du gibst an: DOIF::push ("kein Wasserdurchfluss mehr und Frost!","critical Alarm sent"); damit Perl weiß, welche push-Funktion gemeint ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Tausend Dank! Ich habe mir einen anderen Namen als push ausgesucht, und es funktionierte auf anhieb!

Damian

Zitat von: der-Lolo am 14 November 2018, 21:15:57
Tausend Dank! Ich habe mir einen anderen Namen als push ausgesucht, und es funktionierte auf anhieb!

Nicht, dass du mir noch durch den Perl-Modus zum "echten" Perl-Programmierer wirst :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Ich fühl mich beim PERL DOIF leider immernoch wie zu IF anfängen ;-)
Es gibt hier aber noch sehr viel zu tun - ich muss mich da rein fuchsen.

Alle 16 sekunden bekomme ich nun eine push Nachricht (der WH2600 liefert alle 16 sek. die Aussentemperatur)
- kannst Du mir noch sagen wie ich es schaffe das es nur einmal triggert? Oder vielleicht alle 5 minuten bis das problem behoben ist..?

Damian

Zitat von: der-Lolo am 14 November 2018, 21:26:02

Alle 16 sekunden bekomme ich nun eine push Nachricht (der WH2600 liefert alle 16 sek. die Aussentemperatur)
- kannst Du mir noch sagen wie ich es schaffe das es nur einmal triggert? Oder vielleicht alle 5 minuten bis das problem behoben ist..?

Das habe ich befürchtet. Diese Stelle aus der Commandref habe ich heute schon mal gepostet:

ZitatBemerkung: Im Gegensatz zum FHEM-Modus arbeitet der Perl-Modus ohne Auswertung des eigenen Status (Zustandsauswertung), daher muss der Anwender selbst darauf achten, wiederholende Ausführungen zu vermeiden (im oberen Beispiel z.B. mit FILTER-Option). Elegant lässt sich das Problem der wiederholenden Ausführung bei zyklisch sendenden Sensoren mit Hilfe des Attributes DOIF_Readings lösen.

Bei DOIF-Readings findest du ein passendes Beispiel.

Solche einfachen Definitionen kann man auch ruhig im FHEM-Modus belassen, es sei denn, man will sie weiter ausbauen oder Perl lernen ;)

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

der-Lolo

Danke, das hilft ;-)

Ich sollte viel öfter in die Comandref schauen!

Erweitern ist hier das stichwort - ich möchte auch z.b. wenn ich eine Nachricht schicke von FHEM eine status antwort bekommen, habe gerade gesehen das meine nächste frage "sind im push Text innerhalb der " " auch variablen möglich" in der ComandRef schon beschrieben ist...

klappt das im Perl modus wie im normalen? 

Damian

Zitat von: der-Lolo am 14 November 2018, 21:50:33
Danke, das hilft ;-)

Ich sollte viel öfter in die Comandref schauen!

Erweitern ist hier das stichwort - ich möchte auch z.b. wenn ich eine Nachricht schicke von FHEM eine status antwort bekommen, habe gerade gesehen das meine nächste frage "sind im push Text innerhalb der " " auch variablen möglich" in der ComandRef schon beschrieben ist...

klappt das im Perl modus wie im normalen?

Natürlich. Alles was Perl hergibt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF