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

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