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.
Nur zu, das Beispiel ist ein guter Ausgangspunkt dafür, alles, was du brauchst ist dokumentiert. Fang einfach an und dann schauen wir weiter.
Ä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...""
Gibt es den Befehl fhem_msg überhaupt - ich kenne ihn nicht.
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
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.
Ok, das hilft erstmal...
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?
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.
Tausend Dank! Ich habe mir einen anderen Namen als push ausgesucht, und es funktionierte auf anhieb!
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 :)
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..?
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 ;)
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?
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.
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.
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");
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?
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..?
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.
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.
Zitatdas habe ich jetzt glaube ich noch nicht richtig verstanden...
Wie hast Du das verstanden?
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..
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 ;-)
In dem Block hast du doch gar keine Variable namens $status definiert. $status hast du in der Funktion garage definiert.
Ui, ich dachte der Bezug ist immer die sub Garage... sollte wohl nicht so viel denken ;-)
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.