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

der-Lolo

Ok, ich habe jetzt das hier...
subs {
  sub pushCritical {
    my ($message,$status)=@_;
    fhem ("msg push \@Eichenheim $message");
fhem_set (WPhistory add $status);
fhem_set (WPhistory add $message);
    set_State "$status";
  }
}
{ if ([mF_WMZ:Durchfluss:d] < 1 and [$SELF:frost]) {
    pushCritical ("kein Wasserdurchfluss mehr und Frost!","critical Alarm sent");
  }
}


vielleicht möchte ich einfach zuviele sonder locken ;-)

ein "set WPhistory add kein Wasserduchfluss mehr" vom Eingabefeld aus
ergibt im Device WPhistory vom TYPE readingHistory einen eintrag kein Wasserdurchfluss mehr.

Im Perl-Doif bekomme ich ein


condition c01: Can't locate object method "WPhistory" via package "add" (perhaps you forgot to load "add"?), line 5.


Damian

#16
Zitat von: der-Lolo am 14 November 2018, 22:24:44
Ok, ich habe jetzt das hier...
subs {
  sub pushCritical {
    my ($message,$status)=@_;
    fhem ("msg push \@Eichenheim $message");
fhem_set (WPhistory add $status);
fhem_set (WPhistory add $message);
    set_State "$status";
  }
}
{ if ([mF_WMZ:Durchfluss:d] < 1 and [$SELF:frost]) {
    pushCritical ("kein Wasserdurchfluss mehr und Frost!","critical Alarm sent");
  }
}


vielleicht möchte ich einfach zuviele sonder locken ;-)

ein "set WPhistory add kein Wasserduchfluss mehr" vom Eingabefeld aus
ergibt im Device WPhistory vom TYPE readingHistory einen eintrag kein Wasserdurchfluss mehr.

Im Perl-Doif bekomme ich ein


condition c01: Can't locate object method "WPhistory" via package "add" (perhaps you forgot to load "add"?), line 5.


Du fragtest nach Variablen, das sind aber keine Variablen. In Perl gibt es die Funktion ReadingsVal, um Inhalte der Readings abzufragen.

Edit: ich sehe gerade, dass du $message als Variable nutzen willst. fhem_set ist eine Perl-Funktion, Befehle werden in Anführungszeichen übergeben, hier also:

fhem_set ("WPhistory add $message");
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Ich hab mich heute dann mal um die Benachrichtigung beim thema Garage gekümmert...

Internals:
   CHANGED   
   DEF        subs {
  sub garage {
    my ($msgLoad,$recipient,$status)=@_;
    fhem("msg push $recipient $msgLoad");
    set_State "$status";
  }
}
{ if ([TorOffen] eq "on") {
garage ("","","offen");
set_Exec ("Timer",300,'garage("die Garage ist schon 5 minuten offen","\@Eichenheim","offen-Benachrichtigt")');
}
}
{ if ([TorZu] eq "on") {
garage ("","","geschlossen");
del_Exec ("Timer");
}
}
{ if ([TorZu] ne "on" and [TorOffen] ne "on") {
garage ("","","fährt");
set_Exec ("Timer",22,'garage("Das Garagentor hat den letzten Fahrbefehl nicht abgeschlossen.","\@Eichenheim","undefiniert")');
}
}
   MODEL      Perl
   NAME       GAstateView
   NR         130
   NTFY_ORDER 50-GAstateView
   STATE      geschlossen
   TYPE       DOIF
   READINGS:
     2018-11-18 16:28:41   mode            enabled
     2018-11-18 16:27:18   state           geschlossen
   Regex:
   attr:
   condition:
     0           if (::InternalDoIf($hash,'TorOffen','STATE') eq "on") {
garage ("","","offen");
set_Exec ("Timer",300,'garage("die Garage ist schon 5 minuten offen","\@Eichenheim","offen-Benachrichtigt")');
}

     1           if (::InternalDoIf($hash,'TorZu','STATE') eq "on") {
garage ("","","geschlossen");
del_Exec ("Timer");
}

     2           if (::InternalDoIf($hash,'TorZu','STATE') ne "on" and ::InternalDoIf($hash,'TorOffen','STATE') ne "on") {
garage ("","","fährt");
set_Exec ("Timer",22,'garage("Das Garagentor hat den letzten Fahrbefehl nicht abgeschlossen.","\@Eichenheim","undefiniert")');
}

   devices:
     0           TorOffen
     1           TorZu
     2           TorZu TorOffen
     all         TorOffen TorZu
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
     bm:
       DOIF_Get:
         cnt        1
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        18.11. 16:30:52
         max        1.50203704833984e-05
         tot        1.50203704833984e-05
         mAr:
           HASH(0x49094b8)
           GAstateView
           ?
       DOIF_Notify:
         cnt        416
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        18.11. 16:33:40
         max        0.00014805793762207
         tot        0.0258824825286865
         mAr:
           HASH(0x49094b8)
           HASH(0x6a6f458)
       DOIF_Set:
         cnt        12
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        18.11. 16:38:55
         max        9.89437103271484e-05
         tot        0.000460147857666016
         mAr:
           HASH(0x49094b8)
           GAstateView
           ?
   internals:
     0           TorOffen:STATE
     1           TorZu:STATE
     2           TorZu:STATE TorOffen:STATE
     all         TorOffen:STATE TorZu:STATE
   itimer:
   perlblock:
     0         
     1         
     2         
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Zustand Garagentor
   event-on-change-reading state
   group      msg-adjust
   room       11-Garage,97-Helper


funktioniert alles wie gewünscht - schätze das ist auch schon die eleganteste möglichkeit, oder?

der-Lolo

Vielleicht habe ich mich ein wenig zu früh gefreut - ich bekomme fehler vom globalMsg im Log

2018.11.19 17:01:25 3: msg push   : ERROR: Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush | msgContactMail | msgContactText | msgRecipientPush | msgRecipientMail | msgRecipientText | msgRecipient

2018.11.19 17:01:07 3: msg push   : ERROR: Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush | msgContactMail | msgContactText | msgRecipientPush | msgRecipientMail | msgRecipientText | msgRecipient

2018.11.19 16:54:41 3: msg push   : ERROR: Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush | msgContactMail | msgContactText | msgRecipientPush | msgRecipientMail | msgRecipientText | msgRecipient

2018.11.19 16:54:20 3: msg push   : ERROR: Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush | msgContactMail | msgContactText | msgRecipientPush | msgRecipientMail | msgRecipientText | msgRecipient

2018.11.19 16:07:33 3: msg push   : ERROR: Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush | msgContactMail | msgContactText | msgRecipientPush | msgRecipientMail | msgRecipientText | msgRecipient

2018.11.19 16:07:15 3: msg push   : ERROR: Could not find any Push or Mail contact for device globalMsg - set attributes: msgContactPush | msgContactMail | msgContactText | msgRecipientPush | msgRecipientMail | msgRecipientText | msgRecipient


Keine ahnung wie das zustande kommt - vielleicht hängt es mit den aufrufen der sub garage ohne push Text oder Emfänger zusammen.
garage ("","","offen");

Ich möchte ja das der status des DOIF mir den Zustand des Garagentores anzeigt, aber eben nicht bei jedem vorgang eine nachricht haben. Wie kann ich den den status der Garage im status des DOIFs anzeigen ohne die sub garage aufzurufen..?


Ellert

Zitat von: der-Lolo am 19 November 2018, 18:05:43Ich möchte ja das der status des DOIF mir den Zustand des Garagentores anzeigt, aber eben nicht bei jedem vorgang eine nachricht haben. Wie kann ich den den status der Garage im status des DOIFs anzeigen ohne die sub garage aufzurufen..?
Du könntest einen Block anlegen, der den Status entsprechend setzt.

der-Lolo

Guten Morgen Ellert,
das habe ich jetzt glaube ich noch nicht richtig verstanden...
Ich habe auch mittlerweile nochmal erweitert.

Und zwar - wenn der TelegramBot eine Nachricht "zu" bekommt, soll das Garagentor geschlossen werden.
( Falls man mal losfährt und vergessen hat das Tor zu schliessen )
Hier ein entsprechendes list
Internals:
   DEF        subs {
  sub garage {
    my ($msgLoad,$recipient,$status)=@_;
    fhem("msg push $recipient $msgLoad");
    set_State "$status";
  }
}
{ if ([TorOffen] eq "on") {
garage ("","","offen");
set_Exec ("Timer",300,'garage("die Garage ist schon 5 minuten offen","\@Eichenheim","offen-Benachrichtigt")');
}
}
{ if ([TorZu] eq "on") {
garage ("","","geschlossen");
del_Exec ("Timer");
}
}
{ if ([TorZu] ne "on" and [TorOffen] ne "on") {
garage ("","","fährt");
set_Exec ("Timer",22,'garage("Das Garagentor hat den letzten Fahrbefehl nicht abgeschlossen.","\@Eichenheim","undefiniert")');
}
}
{ if ([Eichenheim_Bot:msgText] eq "zu" and get_State() eq "offen-Benachrichtigt") {
fhem_set "GarageDoor on";
set_State "via Telegram geschlossen";
}}
   MODEL      Perl
   NAME       GAstateView
   NR         130
   NTFY_ORDER 50-GAstateView
   STATE      geschlossen
   TYPE       DOIF
   READINGS:
     2018-11-20 08:38:47   Device          TorZu
     2018-11-20 08:38:29   block_01        executed
     2018-11-20 08:38:47   block_02        executed
     2018-11-20 08:38:47   block_03        executed
     2018-11-19 17:01:06   block_04        executed
     2018-11-19 17:01:06   e_Eichenheim_Bot_msgText zu
     2018-11-20 08:38:29   e_TorOffen_STATE off
     2018-11-20 08:38:47   e_TorZu_STATE   on
     2018-11-19 09:16:35   mode            enabled
     2018-11-20 08:38:47   state           geschlossen
   Regex:
   attr:
   condition:
     0           if (::InternalDoIf($hash,'TorOffen','STATE') eq "on") {
garage ("","","offen");
set_Exec ("Timer",300,'garage("die Garage ist schon 5 minuten offen","\@Eichenheim","offen-Benachrichtigt")');
}

     1           if (::InternalDoIf($hash,'TorZu','STATE') eq "on") {
garage ("","","geschlossen");
del_Exec ("Timer");
}

     2           if (::InternalDoIf($hash,'TorZu','STATE') ne "on" and ::InternalDoIf($hash,'TorOffen','STATE') ne "on") {
garage ("","","fährt");
set_Exec ("Timer",22,'garage("Das Garagentor hat den letzten Fahrbefehl nicht abgeschlossen.","\@Eichenheim","undefiniert")');
}

     3           if (::ReadingValDoIf($hash,'Eichenheim_Bot','msgText') eq "zu" and get_State() eq "offen-Benachrichtigt") {
fhem_set "GarageDoor on";
set_State "via Telegram geschlossen";
}
   devices:
     0           TorOffen
     1           TorZu
     2           TorZu TorOffen
     3           Eichenheim_Bot
     all         TorOffen TorZu Eichenheim_Bot
   helper:
     event      on
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev TorZu
     bm:
       DOIF_Get:
         cnt        6
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        19.11. 09:17:22
         max        1.9073486328125e-05
         tot        9.27448272705078e-05
         mAr:
           HASH(0x49094b8)
           GAstateView
           ?
       DOIF_Notify:
         cnt        44504
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        19.11. 17:01:06
         max        0.0306940078735352
         tot        3.27348232269287
         mAr:
           HASH(0x49094b8)
           HASH(0x3597338)
       DOIF_Set:
         cnt        29
         dmx        -1000
         dtot       0
         dtotcnt    0
         mTS        19.11. 16:07:10
         max        6.69956207275391e-05
         tot        0.00123262405395508
         mAr:
           HASH(0x49094b8)
           GAstateView
           ?
     triggerEvents:
       on
     triggerEventsState:
       state: on
   internals:
     0           TorOffen:STATE
     1           TorZu:STATE
     2           TorZu:STATE TorOffen:STATE
     all         TorOffen:STATE TorZu:STATE
   itimer:
   perlblock:
     0         
     1         
     2         
     3         
   ptimer:
   readings:
     3           Eichenheim_Bot:msgText
     all         Eichenheim_Bot:msgText
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   alias      Zustand Garagentor
   event-on-change-reading state
   group      msg-adjust
   room       11-Garage,97-Helper


Als erweiterung hätte ich jetzt gerne noch das nicht nur "zu" sondern auch "Zu" oder "schliessen" bzw "schließen" dazu führt das das Tor zu fährt. Ausserdem im falle das das Tor per message geschlossen wird eine Nachricht geschlossen wenn die Endlage erreicht wurde.

Den Timer würde ich auch gerne wiederholen, also wenn nicht reagiert wird weiter im 5 minuten Takt benachrichtigen. Vielleicht noch ein schlüsselwort "ignorieren" für den Fall das das Tor offen sein soll, beim hof kehren oder so...

Ich hatte gehofft das  man sowas wie
garage ("","","offen");
in
garage (0,0,"offen");
anpassen könnte, sodass das globalMsg Device nicht denkt das Text und Empfänger fehlen.

Ellert

Zitatdas habe ich jetzt glaube ich noch nicht richtig verstanden...
Wie hast Du das verstanden?

der-Lolo

Ich habe es jetzt mit set_state in den jeweiligen block geschrieben - die sub garage muss ich ja nicht jedesmal  mit neuen werten anstossen...

subs {
  sub garage {
    my ($msgLoad,$recipient,$status)=@_;
    fhem("msg push $recipient $msgLoad");
    set_State "$status";
  }
}
{ if ([TorOffen] eq "on") {
set_State "offen";
set_Exec ("Timer",300,'garage("die Garage ist schon 5 minuten offen","\@Eichenheim","offen-Benachrichtigt")');
}
}
{ if ([TorZu] eq "on") {
set_State "geschlossen";
del_Exec ("Timer");
}
}
{ if ([TorZu] ne "on" and [TorOffen] ne "on") {
set_State "fährt";
set_Exec ("Timer",22,'garage("Das Garagentor hat den letzten Fahrbefehl nicht abgeschlossen.","\@Eichenheim","undefiniert")');
}
}
{ if ([Eichenheim_Bot:msgText] eq "zu" and get_State() eq "offen-Benachrichtigt") {
fhem_set "GarageDoor on";
set_State "via Telegram geschlossen";
}}


so sind zumindest die Fehler im Log weg..

der-Lolo

So, ich bin am weiter Basteln -
leider funktioniert etwas was Damian beschrieb nicht wie gewünscht...

Zitat von: Damian am 14 November 2018, 22:50:00
Du fragtest nach Variablen, das sind aber keine Variablen. In Perl gibt es die Funktion ReadingsVal, um Inhalte der Readings abzufragen.

Edit: ich sehe gerade, dass du $message als Variable nutzen willst. fhem_set ist eine Perl-Funktion, Befehle werden in Anführungszeichen übergeben, hier also:

fhem_set ("WPhistory add $message");

Der Zustand der hier erfasst werden soll ist - GaragenTor ist geschlossen und wird per FHEM oder Taster (=GarageDoor eq "on") im Haus geöffnet.
GDhistory ist hierbei wieder ein Device vom Typ readingsHistory

{ if ([TorZu] eq "on" and [GarageDoor] eq "on") {
fhem_set ("GDhistory add Garagentor $status von drinnen geöffnet");
}
}


Leider gibt es einen Fehler - in block_04
condition c04: Global symbol "$status" requires explicit package name (did you forget to declare "my $status"?), line 2.

Ich bin auch nicht sicher ob das DOIF hier schnell genug sein kann, wenn der Taster im Haus betätigt wird bekommt FHEM per Modbus Variable max 2sek. GarageDoor eq "on" - Zeitgleich wird aber auch der Fahrbefehl abgesetzt, der endschalter am Tor selbst hat zwar ein bisschen Spiel, und das Garagentor fährt ja erst langsam los, aber ich bin nicht sicher ob dieser Zustand so seinen weg bis ins DOIF schafft, der Endschalter ist auch eine Modbus Variable.

Ich möchte gerne versuchen noch mehr in dieses DOIF einzubauen, zum Beispiel könnte ich wenn das Tor sich bewegt und der Befehl nicht per Taster oder FHEM kommt davon ausgehen das:
Wenn das Tor geschlossen war -> jemand mit dem Auto heimkommt.
Wenn das Tor offen war -> jemand mit dem Auto weggefahren ist.
Wenn das Tor offen war und jemand den iButton Reader am Gartentor betätigt -> Garagentor schliessen ( jemand ist mit dem Fahrrad unterwegs )

Ich glaube das bekomme ich alles irgendwie hin - wenn ich dieses block_04 thema los wäre ;-)


Damian

In dem Block hast du doch gar keine Variable namens $status definiert. $status hast du in der Funktion garage definiert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

der-Lolo

Ui, ich dachte der Bezug ist immer die sub Garage... sollte wohl nicht so viel denken ;-)


Damian

Zitat von: der-Lolo am 26 November 2018, 21:35:41
Ui, ich dachte der Bezug ist immer die sub Garage... sollte wohl nicht so viel denken ;-)

Es gibt lokale Variablen und es gibt globale Variablen. Lokale Variablen gelten nur innerhalb einer Funktion oder eines Blocks und müssen mit my definiert werden. DOIF unterstützt auch sogenannte Instanzvariablen siehe Commandref zum Perl-Modus.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF