Hallo
Ich möchte gerne ein DOIF bauen was mir eine Nachricht schickt, wenn ein Update für ein Shelly Device vorhanden ist.
Im Shelly Device gibt es das reading firmware welches die aktuelle Version beinhaltet z.B. v1.5.10
Ist ein Update verfügbar sieht das reading folgendermaßen aus: v1.5.10(update needed to v1.6.0)
Jetzt haben ich mir folgendes DOIF gebaut:
defmod ShellyUpdate DOIF ([":^firmware"] =~ "update") (msg Shelly akualisierung vorhanden!)
attr ShellyUpdate do always
Wenn ich nun bei einem Shelly das Update durchführe und sich das reading von v1.5.10(update needed to v1.6.0)
auf v1.6.0 ändert wird es anscheint erkannt. Als reading Device steht dort das richtige. Ein List sieht dann so aus.
Internals:
DEF ([":^firmware"] =~ "update") (msg Shelly akualisierung vorhanden!)
DOIFDEV ^global$|
FUUID 5e307b07-f33f-e69a-93d7-e88a053b8b2342cd
MODEL FHEM
NAME ShellyUpdate
NR 729
NTFY_ORDER 50-ShellyUpdate
STATE initialized
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-03-10 16:46:36 Device K_Spuelmaschine
2020-02-16 16:11:52 cmd 0
2020-02-16 16:11:52 mode enabled
2020-02-16 16:11:52 state initialized
Regex:
accu:
cond:
:
0:
":^firmware" :^firmware
condition:
0 ::EventDoIf('',$hash,'^firmware',0) =~ "update"
do:
0:
0 msg Shelly akualisierung vorhanden!
1:
helper:
DEVFILTER ^global$|
NOTIFYDEV global|.*
event firmware: v1.6.0
globalinit 1
last_timer 0
sleeptimer -1
triggerDev K_Spuelmaschine
triggerEvents:
power: 1.37
energy: 0
firmware: v1.6.0
energyCons: 0.0000
triggerEventsState:
power: 1.37
energy: 0
firmware: v1.6.0
energyCons: 0.0000
internals:
perlblock:
readings:
trigger:
uiState:
uiTable:
Attributes:
do always
Allerdings klappt es nicht mit der Benachrichtigung, wenn das Reading firmware von v1.5.10 auf v1.5.10(update needed to v1.6.0) wechselt.
Das Event wir wohl erkannt nur Klappt das mit dem Suchen des Textes update nicht.
Internals:
DEF ([":^firmware"] =~ "update") (msg Shelly akualisierung vorhanden!)
DOIFDEV ^global$|
FUUID 5e307b07-f33f-e69a-93d7-e88a053b8b2342cd
MODEL FHEM
NAME ShellyUpdate
NR 729
NTFY_ORDER 50-ShellyUpdate
STATE initialized
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-03-10 17:12:25 Device Klingel_Gong
2020-02-16 16:11:52 cmd 0
2020-02-16 16:11:52 mode enabled
2020-02-16 16:11:52 state initialized
Regex:
accu:
cond:
:
0:
":^firmware" :^firmware
condition:
0 ::EventDoIf('',$hash,'^firmware',0) =~ "update"
do:
0:
0 msg Shelly akualisierung vorhanden!
1:
helper:
DEVFILTER ^global$|
NOTIFYDEV global|.*
event firmware: v1.5.10(update needed to v1.6.0)
globalinit 1
last_timer 0
sleeptimer -1
triggerDev Klingel_Gong
triggerEvents:
firmware: v1.5.10(update needed to v1.6.0)
triggerEventsState:
firmware: v1.5.10(update needed to v1.6.0)
internals:
perlblock:
readings:
trigger:
uiState:
uiTable:
Attributes:
do always
Hat jemand vielleicht ein Tipp wo der Fehler ist.
VG Alex
Grundsätzlich ist ein Eventtrigger entweder wahr oder falsch und nicht mit irgendeinem Text vergleichbar.
Aber zum Glück:
Zitat von: CommandRefAllgemeine Ereignistrigger können ebenfalls so definiert werden, dass sie nicht nur wahr zum Triggerzeitpunkt und sonst nicht wahr sind, sondern Inhalte des Ereignisses zurückliefern. Initiiert wird dieses Verhalten durch die Angabe eines Default-Wertes.
Syntax:
["regex for trigger",<default value>]
Also... Default-Wert ergänzen
Anwendungsbeispiel:
define di_warning DOIF ([":^temperature",0]< 0) (set pushmsg danger of frost $DEVICE)
attr di_warning do always
Vielen Dank für den Schubser in die richtige Richtung.
So funktioniert es nun.
defmod ShellyUpdate DOIF ([":^firmware",""] =~ "update") (msg Shelly akualisierung vorhanden!)
attr ShellyUpdate do always
Hatte das mit =~ falsch verstanden.
VG Alex