Hello,
ich bräuchte mal wieder eure Hilfe. Ich komme irgendwie nicht weiter. Ich habe mir ein AT gebaut das prüft on das Reading B oder batteryPercent kleiner 25 ist und dann cia SignalBot mir eine Nachricht schickt. In dieser Nachricht soll der Name des Devices vorhanden sein und das Event.
*07:46:00 { if(ReadingsVal('.*', '[Bb]atteryPercent.*', 0) < 25) { fhem ("set SignalBot send \@+4917xxxxxxxxx Batteriewarnung, \$NAME' , \$EVENT' Batterie ist alle!")}}
Ich bekomme aber in der Nachricht nicht den Wet von $NAME oder $EVENT sonder eben den Text.
ZitatBatteriewarnung, \$NAME' , \$EVENT' Batterie ist alle!
Wie bekomme ich in den Wert von $NAME und $EVENT in die Nachricht integriert.
Gruß
Christian
Dir ist schon klar, dass ein at einfach zyklisch läuft und dann etwas tut!?
-> wo soll dann $EVENT herkommen? Der einzige $EVENT der passiert ist: at hat ausgelöst ;)
Der Aufruf ReadingsVal mit "Wildcard" geht doch schon gar nicht!
D.h. da muss schon ein Device rein und wenn du das da rein packst, dann hast du ja den Namen.
EDIT: kannst du ganz einfach testen, indem du das einfach in fhemWeb-cmd "reinwirfst":
{ReadingsVal('.*', '[Bb]atteryPercent.*', 0)}
EDIT: es wird (verm.) 0 zurück geliefert, da es weder das Device '.*' gibt noch das Reading '[Bb]atteryPercent.*' also "Ersatzwert" 0. Damit wird dein if immer erfüllt und du bekommst immer eine Nachricht und natürlich nur mit dem "Text" weil siehe: at hat kein $EVENT usw.
Und $EVENT gibt es bei at nicht! Siehe eingangs...
$EVENT gibt es bei notify!
(ebenso $NAME -> auslösendes Device)
D.h. du musst dir z.B. mittels devspec2array die Devices von Interesse "einsammeln", dort geht "Wildcard" (d.h. was in einem list geht, sollte auch damit gehen).
Dann musst du dieses Array abarbeiten -> prüfen was immer du prüfen willst (z.B. Batteriestand) und dann reagieren (auch hier hast du dann das Device ;) ).
EDIT: aber auch bei der weiteren Abfrage mit ReadingsVal geht dann sowas [Bb]atteryPercent NICHT! D.h. du musst dann schon wissen nach was du fragen willst ;) D.h. evtl. mehrere devspec2array oder so...
Oder du baust um auf notify und wenn der Batteriestand unter einem Level ist -> Nachricht, dann klappt das auch mit $NAME und $EVENT 8)
EDIT: ich mache das so https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514
Gruß, Joachim
Vielleicht mehr als du eigentlich willst, aber ich habe hier ein tägliches DOIF laufen:
defmod DI_Batterycheck DOIF ([12:00])\
{ \
my @devs;;\
my $ms="";;\
my $threshold=AttrVal("$SELF","threshold",24);;\
## variables don't work inside the brackets, so use AttrVal\
my $s='[?@:"":"^[Bb]attery$":ReadingsAge($name,"state",0) > (AttrVal("$SELF","threshold",24)*3600) && !(AttrVal("$SELF","exRooms",0) =~ /$room/) && !(AttrVal("$SELF","exDevices",0) =~ /$name/) ]';;\
@devs=split(",",$s);;\
foreach (@devs) {\
my $alias=AttrVal($_,"alias","");;\
my $bt=ReadingsVal($_,"battery","");;\
my $vt=ReadingsVal($_,"voltage","");;\
## batteryThreshold is an optional userAttr to avoid false alarms for seldom used devices\
my $th=AttrVal($_,"batteryThreshold",$threshold)*3600;;\
my $tm=ReadingsAge($_,"state",0);;\
if ($tm>$th) {\
$tm=int($tm/3600);;\
if ($tm<48) {\
$tm.=" h";;\
} else {\
$tm=int($tm/24);;\
$tm.=" d";;\
}\
$ms.="$_($alias):$bt($vt) since $tm\n";;\
}\
}\
if ($ms ne "") {\
$ms="Potential battery issues:\n".$ms;;\
fhem("set SignalBot send \@Joerg $ms");;\
}\
$s='[?@:"":activity:ReadingsVal($name,$reading,0) ne "alive" && ReadingsAge($name,"state",0) > AttrVal("$SELF","threshold",24)*3600 && !(AttrVal("$SELF","exDevices",0) =~ /$name/) ]';;\
$ms="";;\
@devs=split(",",$s);;\
foreach (@devs) {\
my $alias=AttrVal($_,"alias","");;\
my $st=ReadingsVal($_,"activity","");;\
my $tm=int(ReadingsAge($_,"state",0)/3600);;\
if ($tm<48) {\
$tm.=" h";;\
} else {\
$tm=int($tm/24);;\
$tm.=" d";;\
}\
$ms.="$_($alias):$st since $tm\n";;\
}\
if ($ms ne "") {\
$ms="Unresponsive HM devices\n".$ms;;\
fhem("set SignalBot send \@Joerg $ms");;\
}\
\
}\
attr DI_Batterycheck userattr threshold exDevices exRooms
attr DI_Batterycheck do always
attr DI_Batterycheck exDevices HM_Sec_RHS_JEQ0261944
attr DI_Batterycheck exRooms AUTOCREATE
attr DI_Batterycheck threshold 48
Das Teil durchsucht alle Devices die ein "battery" reading haben und alarmiert wenn diese sich "threshold" (=48) Stunden nicht mehr aktualisiert haben.
Etwas anderer Ansatz, da ich die Batterien normalerweise bis zum Schluss leermachen will, d.h. erst alarmiere, wenn die Device nicht mehr sendet.
Ausserdem sucht er noch nach Homematic Devices die sich eine gewisse Zeit nicht gemeldet haben.
Ich habe dem DOIF hier noch die Möglichkeit spendiert gewisse Räume und Devices auszunehmen.
In meinem Fall AUTOCREATE da sich hier Fremddevices meines rfxtrx433 tummeln und Devices die aktuell außer Betrieb sind.
Etwas vereinfacht für nur deinen Anwendungsfalls (Battery nicht ok):
defmod DI_Batterycheck2 DOIF ([12:00])\
{ \
my @devs;;\
my $ms="";;\
## variables don't work inside the brackets, so use AttrVal\
my $s='[?@:"":"^[Bb]attery$":!($_ =~ /ok/) && !(AttrVal("$SELF","exRooms",0) =~ /$room/) && !(AttrVal("$SELF","exDevices",0) =~ /$name/) ]';;\
@devs=split(",",$s);;\
foreach (@devs) {\
my $alias=AttrVal($_,"alias","");;\
my $bt=ReadingsVal($_,"battery","");;\
my $vt=ReadingsVal($_,"voltage","");;\
## batteryThreshold is an optional userAttr to avoid false alarms for seldom used devices\
if ($vt ne "") {\
$ms.="$_($alias):$bt(voltage:$vt)\n";;\
} else {\
$ms.="$_($alias):$bt\n";;\
}\
}\
if ($ms ne "") {\
$ms="Potential battery issues:\n".$ms;;\
fhem("set SignalBot send \@Joerg $ms");;\
}\
}\
attr DI_Batterycheck2 userattr exDevices exRooms
attr DI_Batterycheck2 do always
attr DI_Batterycheck2 exDevices HM_Sec_RHS_JEQ0261944
attr DI_Batterycheck2 exRooms AUTOCREATE
Hi,
ok also mit einem AT wird das wohl nichts.
Also habe ich mir das DOIF von Adimarantis angeschaut. Ja es soll täglich geprüft werden aber ich verstehe es nicht.
[Bb]attery$":!($_ =~ /ok/)
prüfst du ob eine reading nach dem ok oder nicht ok. Ich möchte aber nach B oder b atteryPercent schauen in den events.
([":batteryPercent",0] < 25)
(set SigBot send \@+491234567890 "Eine Battrie " $NAME " ist unter 25")
DOELSE()
Wenn ich es richtig verstehe sollte $NAME den Device Namen des Gerätes liefern der das event batteryPercent kleiner 25 hatte.
Ich sehe aber den text $NAME (also Einer Battrie $NAME is unter 25).
Gruß
Christian
Zitat von: Kohle77 am 17 Oktober 2022, 13:31:34
ok also mit einem AT wird das wohl nichts.
Warum nicht?
Habe ich doch erläutert wie das geht/gehen kann:
devspec2array und dann in einer Schleife abfragen und gut...
Ich prüfe z.B. jeden Tag um 17:00 meine batteriebetrieben ZWave-Geräte.
ein at (RawDef):
defmod atCheckZWaveDevices at *17:00:00 {my_CheckZWaveDevices()}
und die Sub in myUtils:
sub my_CheckZWaveDevices()
{
my @ZWaveDevices = devspec2array("TYPE=ZWave");
my $ActDevice = "na";
my $WakeupInterval = 65535;
# loop through all ZWave-Devices
foreach $ActDevice (@ZWaveDevices)
{
if(AttrVal($ActDevice, "disable", "0") eq "1")
{
Log3(undef, 1, "my_CheckZWaveDevices Device $ActDevice disabled.");
next;
}
# check if the Device has wakeupReport available (Battery-Device)
if(ReadingsVal($ActDevice, "wakeup", "na") ne "na")
{
$WakeupInterval = ReadingsNum($ActDevice, "wakeupReport", 65535);
if((ReadingsAge($ActDevice, "wakeup", $WakeupInterval) > 2 * $WakeupInterval) && (ReadingsAge($ActDevice, "battery", $WakeupInterval) > 2 * $WakeupInterval))
{
Log3(undef, 1, "my_CheckZWaveDevices Device $ActDevice is dead!");
fhem("set $myTelegramBot message $ActDevice is dead!");
}
}
else
{
Log3(undef, 1, "my_CheckZWaveDevices Device $ActDevice ignored.");
}
Log3(undef, 1, "my_CheckZWaveDevices ActDevice: $ActDevice WakeupInterval: $WakeupInterval");
}
}
Mal versuchsweise abgewandelt für dich:
sub my_CheckBatteryDevices()
{
my @DevicesbatteryPercent = devspec2array("batteryPercent=..*");
my @DevicesBatteryPercent = devspec2array("BatteryPercent=..*");
my $ActDevice = "na";
# loop through the Devices
foreach $ActDevice (@DevicesbatteryPercent)
{
if(ReadingsNum($ActDevice, "batteryPercent", 0) < 25)
{
# send the message / Device-Name: $ActDevice
}
}
# loop through the Devices
foreach $ActDevice (@DevicesBatteryPercent)
{
if(ReadingsNum($ActDevice, "BatteryPercent", 0) < 25)
{
# send the message / Device-Name: $ActDevice
}
}
}
Mag jetzt nicht schön sein aber sollte (in etwa) gehen...
Gruß, Joachim
Hi,
ich kann an TYPE die devices nicht festmachen.
Ein Teil sind FBDECT devices (Heizungsthermostat) und der andere Teil sind MQTT Fensterkontakte.
ZitatDEF FritzSmart:09995_0702078 actuator,tempSensor
FUUID 6006cddc-f33f-d2f4-8485-208a926f2f4ce162
FritzSmart_MSGCNT 60
FritzSmart_TIME 2022-10-17 14:09:43
IODev FritzSmart
LASTInputDev FritzSmart
MSGCNT 60
NAME HzMiChBu
NR 401
STATE desired-temp: 14.0 C
TYPE FBDECT
eventCount 60
id 09995_0702078
props actuator,tempSensor
webCmd desired-temp
READINGS:
2022-10-17 14:09:43 AIN 09995 0702078
2022-10-17 14:09:43 FBNAME Büro Christian
2022-10-17 14:09:43 FBPROP actuator,tempSensor
2022-10-17 14:09:43 FBTYPE FRITZ!DECT 301
2022-10-17 14:09:43 ID 20
2022-10-17 09:14:40 IODev FritzSmart
2021-11-02 08:09:45 TempBefore 16.0
2022-10-17 14:09:43 battery 80 %
2022-10-17 14:09:43 batteryPercent 80
2022-10-17 14:09:43 batteryState ok
2022-10-17 14:09:43 batterylow 0
2022-10-17 14:09:43 boostactive no
2022-10-17 14:09:43 boostactiveendtime N/A
2022-10-17 14:09:43 day-temp 21.0 C
2022-10-17 14:09:43 desired-temp 14.0 C
2022-10-17 14:09:43 devicelock no
2022-10-17 14:09:43 errorcode noError (0)
2022-10-17 14:09:43 fwversion 05.02
2022-10-17 14:09:43 holidayactive no
2022-10-17 14:09:43 locked no
2022-10-17 14:09:43 nextPeriodStart 1970-01-01 01:00:00
2022-10-17 14:09:43 nextPeriodTemp 21.0 C
2022-10-17 14:09:43 night-temp 16.0 C
2022-10-17 14:09:43 present yes
2022-10-17 14:09:43 state desired-temp: 14.0 C
2022-10-17 14:09:43 summeractive no
2022-10-17 14:09:43 tempadjust 0.0 C
2022-10-17 14:09:43 temperature 22.5 C (measured)
2022-10-17 14:09:43 windowopenactiv no
2022-10-17 14:09:43 windowopenactiveendtime N/A
und das andere:
ZitatIODev Mosquitto
NAME BueroChris
NR 289
STATE close
TYPE MQTT_DEVICE
eventCount 105
READINGS:
2022-10-17 09:14:40 IODev Mosquitto
2022-10-17 14:11:02 batteryPercent 98
2022-10-17 14:11:02 error 0
2022-10-17 14:11:02 fw_ver 20211004-121334/v1.11.5-gdedfb52
2022-10-17 14:11:02 id mibueoben
2022-10-17 14:11:02 ip 192.168.150.32
2022-10-17 14:11:02 mac E8DB84D3BA82
2022-10-17 14:11:02 model SHDW-2
2022-10-17 14:11:02 new_fw 0
2022-10-17 14:12:33 online false
2022-10-17 10:01:35 state close
2022-10-17 14:12:33 transmission-state incoming publish received
Gruß
Christian
Liest du die Antworten bevor du irgendwelche "Märchen" raushaust? 8)
Wo steht denn was von TYPE?
Ausser in MEINER Version für MICH!
In der angepassten für dich steht nix von TYPE...
Ob das devpec2arry dann genau so passt kannst du ja mittels des "list" Befehls leicht testen und wenn es niht passt: anpassen.
EDIT: wenn ich mir schon die Mühe mache...
EDIT: ich sehe jetzt eher KEIN Device was ein Reading BatteryPercent hat, sondern nur welche mit batteryPercent. Dann kann das 2te devspec2arry auch weg, musst aber ja du wissen ich habe ja deine Devices nicht...
Gruß, Joachim
Ich gebe zu, meine Lösung ist etwas tricky.
Wahrscheinlich auch besser, wenn du einen Weg gehst, den du auch verstehst.
Nur der Vollständigkeit halber. Mit Prozenten wäre folgende Zeile zu verwenden:
my $s='[?@:"":"^[Bb]attery[Pp]ercent$":$_<25 && !(AttrVal("$SELF","exRooms",0) =~ /$room/) && !(AttrVal("$SELF","exDevices",0) =~ /$name/) ]';
@devs=split(",",$s);
Es gibt da so viele Bastellösungen im Forum - müsste man doch mal ein Modul bauen.
Hi,
ich versteh einfach zu wenig um mit myUtils etc. da was zu machen.
Mein trigger funktioniert ja und ich will doch noch das in der Message die ich erhalte eben nicht $NAME steht sondern der Name des devices das eben unter 25% war.
Es gibt ja schon diesen Thread:
https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514 (https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514)
aber der passt zu meinen devices auch nicht.
Vielen Dank
Gruß
Christian
Zitat von: Adimarantis am 17 Oktober 2022, 15:29:49
Es gibt da so viele Bastellösungen im Forum - müsste man doch mal ein Modul bauen.
Falls du Vorschläge zur Verbesserung von "monitoring" hast: Gerne...
Ansonsten wird es halt immer so bleiben, dass man eine gewisse Idee davon haben muss, wie z.B. devspec funktioniert, und daran krankt es hier halt schon beim TE.
Zitat von: Kohle77 am 17 Oktober 2022, 15:38:29
ich versteh einfach zu wenig um mit myUtils etc. da was zu machen.
Wie willst du fhem nutzen wenn du das nicht hinbekommst?
Bzw. dann musst du halt nutzen was an Modulen da ist und gut.
Wenn da nichts dabei ist: lernen oder lassen...
MyUtils: https://wiki.fhem.de/wiki/99_myUtils_anlegen
Du musst das ja auch nicht in eine myUtils tun.
Du kannst auch einfach auf DEF deines at klicken und dann den Code da irgendwie unterbringen...
Aber bei aller Liebe das mache ich jetzt nicht auch noch...
...selber lernen und v.a. verstehen was man da so "zusammenkopiert" darf, nein MUSS schon sein!
Wie willst du etwas warten und erweitern, wenn du nicht verstehst was du tust/getan hast?
Zitat von: Kohle77 am 17 Oktober 2022, 15:38:29
Es gibt ja schon diesen Thread:
https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514 (https://forum.fhem.de/index.php/topic,82637.msg747514.html#msg747514)
aber der passt zu meinen devices auch nicht.
Kann man aber anpassen... ;)
Und wenn man dort ein list seiner Devices postet, kann es sogar sein, dass es eingebaut wird.
EDIT: aber (auch) das ist KEIN Modul und (vermutlich) auch nicht nur copy/paste...
Gruß, Joachim
Zitat von: Beta-User am 17 Oktober 2022, 15:42:12
Falls du Vorschläge zur Verbesserung von "monitoring" hast: Gerne...
Ansonsten wird es halt immer so bleiben, dass man eine gewisse Idee davon haben muss, wie z.B. devspec funktioniert, und daran krankt es hier halt schon beim TE.
Wie man hier schon sieht kann Battery-Monitoring viele Gesichter haben, battery=low, device unansprechbar, percent < threshold - wobei die % z.B. man bei einigen Homematic devices aus LOW_BAT_LIMIT und BATTERY_STATE errechnen könnte, dann möchte man evtl. devices oder Räume ausschliessen und eine Benachrichtung senden (msg?)
Monitoring erwartet, dass man sich damit beschäftigt, wie das im Detail aussieht, bis hin zu regexp und ein wenig Perl um Benachrichtungen anzupassen.
Die Diskussion hier hat mich gleich an https://forum.fhem.de/index.php/topic,129454.msg1239973.html#msg1239973 erinnert.
Hier haben wir einen "user" der nicht zu tief in die FHEM Materie einsteigen möchte/kann, wogegen unsere Lösungen eher für Nerds sind.
Was ich jetzt mit Modul meine, ist ein spezielles Battery Modul, welches mit möglichst einfacher UI möglichst generisch alle bekannten Arten von Battery Problemen abdeckt, und der Anwender nur noch anhakt, was er möchte, Grenzwerte und Kommunikationspfade einträgt und (jetzt wirds schon anspruchvoller) potentielle Ausnahmen festlegt.
Hello,
natürlich weiß ich das ihr das alle in eurer Freizeit macht und ich dachte es wäre ganz einfach das $NAME in dem Signalbot bzw Ausführungsteil zu verwenden.
Wie auch immer ich werde mich mal tiefer mit den verschieden Lösungsansätzen tiefer beschäftigen und vielleicht finde ich eine Lösung die ich hinbekomme.
Danke für eure Hilfe
Gruß
Christian
Zitat von: Kohle77 am 18 Oktober 2022, 06:58:10
...ich dachte es wäre ganz einfach das $NAME in dem Signalbot bzw Ausführungsteil zu verwenden.
Bei einem notify wäre es das ja auch.
Bei einem at gibt es das natürlich nicht, wo sollte es auch herkommen?
Das einzige Event was ein at erzeugt ist eben: ich habe ausgelöst ;)
(und da ist das auslösende Device halt nun mal das at selbst)
Zitat von: Kohle77 am 18 Oktober 2022, 06:58:10
Wie auch immer ich werde mich mal tiefer mit den verschieden Lösungsansätzen tiefer beschäftigen und vielleicht finde ich eine Lösung die ich hinbekomme.
Naja und evtl. auch noch mal die generellen Abläufe in fhem, dann sind auch die Vorschläge plausibler und auch klar(er) warum das bei einem at halt nicht "einfach so" geht...
Viel Erfolg, Joachim
Hi,
ich bin ein kleines Stück weiter und denke ich habe schon wieder einen Denkfehler.
Die Fensterkontakte habe ja keinen OK oder False status reading. Also hatte ich die Idee ein userreading anzulegen das wie folgt aussieht.
batteryState { return "ok" if(ReadingsVal("BueroChris","batteryPercent","0"))>"25"; return "low"}
damit wird ein Reading "batteryState" angelegt das ok ist und auf low gesetzt wird wenn die batteryPercent kleiner 25 ist.
Das funktioniert auch (setreading BueroChris batteryPercent 20 und der batteryState geht auf low.
Das erzeugt auch ein EVENT (aus dem Event Monitor):
Zitat2022-10-18 08:48:11 MQTT_DEVICE BueroChris batteryPercent: 30
2022-10-18 08:48:11 MQTT_DEVICE BueroChris batteryState: ok
2022-10-18 08:48:32 MQTT_DEVICE BueroChris batteryPercent: 20
2022-10-18 08:48:32 MQTT_DEVICE BueroChris batteryState: low
Wenn ich nun das DOIF von MadMax-FHEM benutze:
([06:06])
{
my @devs;;
my $ms="";;
## variables don't work inside the brackets, so use AttrVal
my $s='[?@:"":"^[Bb]attery$":!($_ =~ /ok/) && !(AttrVal("$SELF","exRooms",0) =~ /$room/) && !(AttrVal("$SELF","exDevices",0) =~ /$name/) ]';;
@devs=split(",",$s);;
foreach (@devs) {
my $alias=AttrVal($_,"alias","");;
my $bt=ReadingsVal($_,"battery","");;
my $vt=ReadingsVal($_,"voltage","");;
## batteryThreshold is an optional userAttr to avoid false alarms for seldom used devices
if ($vt ne "") {
$ms.="$_($alias):$bt(voltage:$vt)\n";;
} else {
$ms.="$_($alias):$bt\n";;
}
}
if ($ms ne "") {
$ms="Potential battery issues:\n".$ms;;
fhem("set SignalBot send \@+49123456789 $ms");;
}
}
Bekomme ich auch eine Nachricht in Signal aber von den devices bei dehnen das reading batteryState den Wert ok hat (obwohl es doch eingelich senden sollte wenn es nicht ok ist??).
Mal von einem device aus dem List:
Zitat
READINGS:
2022-10-18 09:06:14 AIN 09995 0702078
2022-10-18 09:06:14 FBNAME Büro Christian
2022-10-18 09:06:14 FBPROP actuator,tempSensor
2022-10-18 09:06:14 FBTYPE FRITZ!DECT 301
2022-10-18 09:06:14 ID 20
2022-10-17 15:26:10 IODev FritzSmart
2021-11-02 08:09:45 TempBefore 16.0
2022-10-18 09:06:14 battery 80 %
2022-10-18 09:06:14 batteryPercent 80
2022-10-18 09:06:14 batteryState ok
2022-10-18 09:06:14 batterylow 0
2022-10-18 09:06:14 boostactive no
2022-10-18 09:06:14 boostactiveendtime N/A
2022-10-18 09:06:14 day-temp 21.0 C
2022-10-18 09:06:14 desired-temp 14.0 C
2022-10-18 09:06:14 devicelock no
2022-10-18 09:06:14 errorcode noError (0)
2022-10-18 09:06:14 fwversion 05.02
2022-10-18 09:06:14 holidayactive no
2022-10-18 09:06:14 locked no
2022-10-18 09:06:14 nextPeriodStart 1970-01-01 01:00:00
2022-10-18 09:06:14 nextPeriodTemp 21.0 C
2022-10-18 09:06:14 night-temp 16.0 C
2022-10-18 09:06:14 present yes
2022-10-18 09:06:14 state desired-temp: 14.0 C
2022-10-18 09:06:14 summeractive no
2022-10-18 09:06:14 tempadjust 0.0 C
2022-10-18 09:06:14 temperature 22.5 C (measured)
2022-10-18 09:06:14 windowopenactiv no
2022-10-18 09:06:14 windowopenactiveendtime N/A
aber der Name des Fensterkontakts, bei dem ich ein userreading angelegt habe, taucht nicht in der Nachricht auf.
Die Readings des Fensterkontakts:
Zitat
READINGS:
2022-10-17 15:26:10 IODev Mosquitto
2022-10-18 05:47:02 announce {"id":"mibueoben","model":"SHDW-2","mac":"E8DB85D3CA82","ip":"192.168.150.32","new_fw":false,"fw_ver":"20231104-2223334/v3.33.5-gdadfb82"}
2022-10-18 09:14:10 batteryPercent 30
2022-10-18 09:14:10 batteryState ok
2022-10-18 05:47:02 error 0
2022-10-18 05:47:02 fw_ver 20231104-222334/v3.33.5-gdadfb82
2022-10-18 05:47:02 id mibueoben
2022-10-18 05:47:02 ip 192.168.178.32
2022-10-18 05:47:02 mac E8DB84D3BA82
2022-10-18 05:47:02 model SHDW-2
2022-10-18 05:47:02 new_fw 0
2022-10-18 05:48:32 online false
2022-10-17 10:01:35 state close
2022-10-18 05:48:32 transmission-state incoming publish received
Sollte der Name nicht auch in der gesendeten Nachricht stehen da es ja ein Reading "batteryState" mit ok hat?
Warum wird die Nachricht geschickt obwohl der "batteryState" ok hat?
Wie kann ich mir in fhem commando zeile den wert eine Variable anzeigen lassen.
Also in etwa so
{my $vt=ReadingsVal("BueroChris","voltage","");; print $vt}
?
Gruß
Christian
...irgendwie wird das hier immer gruseliger...
Zitat von: Beta-User am 18 Oktober 2022, 09:31:48
...irgendwie wird das hier immer gruseliger...
;)
Zitat von: Kohle77 am 18 Oktober 2022, 09:29:38
Hi,
ich bin ein kleines Stück weiter und denke ich habe schon wieder einen Denkfehler.
Die Fensterkontakte habe ja keinen OK oder False status reading. Also hatte ich die Idee ein userreading anzulegen das wie folgt aussieht.
batteryState { return "ok" if(ReadingsVal("BueroChris","batteryPercent","0"))>"25"; return "low"}
damit wird ein Reading "batteryState" angelegt das ok ist und auf low gesetzt wird wenn die batteryPercent kleiner 25 ist.
[/code]
nimm ReadingsNum weil Zahlenwerte ;)
nimm $name im userReadings, dann brauchst du nicht bei jedem Device anpassen, sondern kannst dasselbe userReadings bzw. denselben userReadings-Code einfach einfügen :)
Zitat von: Kohle77 am 18 Oktober 2022, 09:29:38
Das erzeugt auch ein EVENT (aus dem Event Monitor):
Wenn ich nun das DOIF von MadMax-FHEM benutze:
([06:06])
{
my @devs;;
my $ms="";;
## variables don't work inside the brackets, so use AttrVal
my $s='[?@:"":"^[Bb]attery$":!($_ =~ /ok/) && !(AttrVal("$SELF","exRooms",0) =~ /$room/) && !(AttrVal("$SELF","exDevices",0) =~ /$name/) ]';;
@devs=split(",",$s);;
foreach (@devs) {
my $alias=AttrVal($_,"alias","");;
my $bt=ReadingsVal($_,"battery","");;
my $vt=ReadingsVal($_,"voltage","");;
## batteryThreshold is an optional userAttr to avoid false alarms for seldom used devices
if ($vt ne "") {
$ms.="$_($alias):$bt(voltage:$vt)\n";;
} else {
$ms.="$_($alias):$bt\n";;
}
}
if ($ms ne "") {
$ms="Potential battery issues:\n".$ms;;
fhem("set SignalBot send \@+49123456789 $ms");;
}
}
Danke für die Lorbeeren aber ist nicht von mir ;)
EDIT: warum eben nicht den einfachen Code von mir? Da wird der NAME des Devices ausgegeben und gut... :) Ok, du musst nat. noch die Zeile für's Senden eingeben... Und evtl. schauen ob du wirklich beide devspec2array brauchst... Und noch mal es muss keine Sub in myUtils sein, man kann das auch einfach ins at packen. Mache ich aber so, da ich es übersichtlicher finde, ich weiß, dass ich in Perl unterwegs bin, ich die myUtils bearbeiten kann ohne die Config anpacken zu müssen usw.
Zitat von: Kohle77 am 18 Oktober 2022, 09:29:38
Sollte der Name nicht auch in der gesendeten Nachricht stehen da es ja ein Reading "batteryState" mit ok hat?
Warum wird die Nachricht geschickt obwohl der "batteryState" ok hat?
Trotzdem so ich das sehe wird mit alias gearbeitet.
Da du leider nur die Readings und kein komplettes list gepostet hast -> keine Ahnung, ob es einen alias gibt ;)
Und bitte sowas in code-Tags, danke :)
EDIT: der NAME müsste in $_ stehen...
Zitat von: Kohle77 am 18 Oktober 2022, 09:29:38
Wie kann ich mir in fhem commando zeile den wert eine Variable anzeigen lassen.
Also in etwa so
{my $vt=ReadingsVal("BueroChris","voltage","");; print $vt}
?
Entweder einfach:
{ReadingsVal("BueroChris","voltage","")}
Besser:
{ReadingsVal("BueroChris","voltage","Ersatz")}
Dann siehst du besser was passiert 8)
Oder eben noch besser (weil Zahlenwerte):
{ReadingsNum("BueroChris","voltage",-1)}
Ausgabe einer Variablen dann genauso (warum aber der Umweg über eine Variable?):
{my $vt=ReadingsVal("BueroChris","voltage","");; return $vt}
bzw. obige "Abwandlungen"... ;)
Gruß, Joachim
Hallo,
vielen Dank für eure Hilfe.
Ich habe es mir mal noch einfacher gemacht so das ich es halt verstehe.
Es sind ja nur 10 Devices die eine Batterie haben. Habe mich daran orientiert:
Ansatz von hier: https://www.meintechblog.de/2015/08/fhem-rechtzeitige-benachrichtigung-bei-leeren-batterien/ (http://ansatz%20von%20hier:%20https://www.meintechblog.de/2015/08/fhem-rechtzeitige-benachrichtigung-bei-leeren-batterien/)
Habe ein AT für die FB Dect Heitkörperthermostate und ein AT für die Fensterkontakte.
Musste auch feststellen das die Fensterkontakte nicht zyklisch senden aber das ist was anderes.
Mit dem Code untern prüfe ich immer Mittwochs um 15:00 ob eine der 4 Geräte unter 25 ist:
define BatteryLowSignal at *15:00:00 {if ($wday == 3)\
{if (ReadingsVal("Device1", "batteryPercent", "-1") < "25")\
{fhem ("set SigBot send \@NameNr 'Heizkoerper Ventil RAUM-A' 'Bitte Batterie tauschen' ")}\
};\
{if (ReadingsVal("HzMiGaWc", "batteryPercent", "-1") < "25")\
{fhem ("set SigBot send \@NameNr 'Heizkoerper Ventil RAUM-B WC' 'Bitte Batterie tauschen' ")}\
};\
{if (ReadingsVal("HzMiSzLi", "batteryPercent", "-1") < "25")\
{fhem ("set SigBot send \@NameNr 'Heizkoerper Ventil RAUM-C links' 'Bitte Batterie tauschen' ")}\
};\
{if (ReadingsVal("HzMiSzRe", "batteryPercent", "-1") < "25")\
{fhem ("set SigBot send \@NameNr 'Heizkoerper Ventil RAUM-C rechts' 'Bitte Batterie tauschen' ")}\
};\
}
Vielleicht nicht schön aber es funktioniert für mich.
Gruß
Christian
Hallo Christian,
schön, dass wieder offen ist ;)
Wie bereits geschrieben:
schön, dass es für dich geht.
Umständlich ist es trotzdem ;)
(wenn ein neues Gerät dazu kommt musst du an den Code, wenn es umbenannt wird musst du anpassen usw. ;) )
Aber kann ja noch werden...
Du solltest trotzdem mal überlegen wenigstens auf ReadingsNum umzubauen, dann vergleichst du wirklich Zahlen und nicht Zeichenketten.
Und wenn du das < verwendest müsste es mindestens einen Eintrag geben sowas wie: isn't numeric... ;)
Weil Zeichenketten werden mit ne, eq, le, usw. verglichen...
https://de.wikibooks.org/wiki/Perl-Programmierung:_Operatoren#Stringvergleichende_Operatoren
Und: meine Lösung ist doch von deiner gar nicht so weit weg, außer, dass ich halt keine festen Devices nutze, sondern nur die, die eben ein batteryPercent bzw. BatteryPercent haben ;)
Gruß, Joachim
Hallo,
weil doch nach einem vollen list gefragt wurde.
Für den Fritz!DECT 301:
Internals:
CFGFN /opt/fhem/FHEM/CFG/21_heizung.cfg
DEF FritzSmart:09995_0702078 actuator,tempSensor
FUUID 6006cddc-f33f-d2f4-8485-208a926f2f4ce162
FritzSmart_MSGCNT 37
FritzSmart_TIME 2022-10-19 11:18:49
IODev FritzSmart
LASTInputDev FritzSmart
MSGCNT 37
NAME HzMiChBu
NR 400
STATE desired-temp: 14.0 C
TYPE FBDECT
eventCount 37
id 09995_0702078
props actuator,tempSensor
webCmd desired-temp
READINGS:
2022-10-19 11:18:49 AIN 09995 0702128
2022-10-19 11:18:49 FBNAME Büro Chris
2022-10-19 11:18:49 FBPROP actuator,tempSensor
2022-10-19 11:18:49 FBTYPE FRITZ!DECT 301
2022-10-19 11:18:49 ID 20
2022-10-19 08:18:46 IODev FritzSmart
2022-10-19 11:18:49 battery 80 %
2022-10-19 11:18:49 batteryPercent 80
2022-10-19 11:18:49 batteryState ok
2022-10-19 11:18:49 batterylow 0
2022-10-19 11:18:49 boostactive no
2022-10-19 11:18:49 boostactiveendtime N/A
2022-10-19 11:18:49 day-temp 21.0 C
2022-10-19 11:18:49 desired-temp 14.0 C
2022-10-19 11:18:49 devicelock no
2022-10-19 11:18:49 errorcode noError (0)
2022-10-19 11:18:49 fwversion 05.02
2022-10-19 11:18:49 holidayactive no
2022-10-19 11:18:49 locked no
2022-10-19 11:18:49 nextPeriodStart 1970-01-01 01:00:00
2022-10-19 11:18:49 nextPeriodTemp 21.0 C
2022-10-19 11:18:49 night-temp 16.0 C
2022-10-19 11:18:49 present yes
2022-10-19 11:18:49 state desired-temp: 14.0 C
2022-10-19 11:18:49 summeractive no
2022-10-19 11:18:49 tempadjust 0.0 C
2022-10-19 11:18:49 temperature 22.5 C (measured)
2022-10-19 11:18:49 windowopenactiv no
2022-10-19 11:18:49 windowopenactiveendtime N/A
Attributes:
DbLogExclude .*
IODev FritzSmart
alias Heizköper Büro
event-min-interval power:120
room DG_MI->Buero Chris
verbose 0
uns für den Fenstersensor (Shelly):
Internals:
CFGFN /opt/fhem/FHEM/CFG/13_mqtt.cfg
FUUID 617a2729-f33f-d2f4-5e7e-67421914707b79af
IODev Mosquitto
NAME BueroChris
NR 288
STATE close
TYPE MQTT_DEVICE
eventCount 2
READINGS:
2022-10-19 08:18:46 IODev Mosquitto
2022-10-19 05:47:23 announce {"id":"mibueoben","model":"SHDW-2","mac":"E8DB84D3BA82","ip":"192.168.178.32","new_fw":false,"fw_ver":"xxxxxxxx-yyyyyyy/va.bb.c-eeeeee12"}
2022-10-19 05:47:23 batteryPercent 97
2022-10-19 08:18:50 batteryState ok
2022-10-19 05:47:23 error 0
2022-10-19 05:47:23 fw_ver xxxxxxxx-yyyyyyy/va.bb.c-eeeeee12
2022-10-19 05:47:23 id mibueoben
2022-10-19 05:47:23 ip 190.132.150.32
2022-10-19 05:47:23 mac E7DA84B3BC92
2022-10-19 05:47:23 model SHDW-2
2022-10-19 05:47:23 new_fw 0
2022-10-19 05:48:54 online false
2022-10-17 10:01:35 state close
2022-10-19 08:18:50 transmission-state subscription acknowledged
message_ids:
sets:
subscribe:
shellies/mibueoben/announce
shellies/mibueoben/sensor/battery
shellies/mibueoben/sensor/error
shellies/mibueoben/online
shellies/mibueoben/sensor/state
subscribeExpr:
^shellies\/mibueoben\/announce$
^shellies\/mibueoben\/sensor\/battery$
^shellies\/mibueoben\/sensor\/error$
^shellies\/mibueoben\/online$
^shellies\/mibueoben\/sensor\/state$
subscribeQos:
shellies/mibueoben/announce 0
shellies/mibueoben/online 0
shellies/mibueoben/sensor/battery 0
shellies/mibueoben/sensor/error 0
shellies/mibueoben/sensor/state 0
subscribeReadings:
shellies/mibueoben/announce:
cmd
name announce
shellies/mibueoben/online:
cmd
name online
shellies/mibueoben/sensor/battery:
cmd
name batteryPercent
shellies/mibueoben/sensor/error:
cmd
name error
shellies/mibueoben/sensor/state:
cmd
name state
Attributes:
DbLogExclude .*
alias Fenster Büro Chris
comment IP: 190.132.150.32
devStateIcon open:fts_window_1wbb_open@red close:fts_window_1w@black
group Chris Buero
room Buero Chris
subscribeReading_announce shellies/mibueoben/announce
subscribeReading_batteryPercent shellies/mibueoben/sensor/battery
subscribeReading_error shellies/mibueoben/sensor/error
subscribeReading_online shellies/mibueoben/online
subscribeReading_state shellies/mibueoben/sensor/state
userReadings batteryState { return "ok" if(ReadingsVal("BueroChris","batteryPercent","0"))>"25"; return "low"}
userattr subscribeReading_state subscribeReading_batteryPercent subscribeReading_error subscribeReading_announce subscribeReading_online
Gruß
Christian
Zitat von: Kohle77 am 19 Oktober 2022, 11:27:06
weil doch nach einem vollen list gefragt wurde.
Wenn sich das auf das:
Zitat
Und wenn man dort ein list seiner Devices postet, kann es sogar sein, dass es eingebaut wird.
von hier: https://forum.fhem.de/index.php/topic,129736.msg1240072.html#msg1240072
bezieht, dann war ja gemeint (und formuliert) das list DORT zu posten, wenn du willst, dass es DORT eingebaut wird ;)
Zumindest ist mir jetzt keine weitere "Anfrage" eines lists aufgefallen ;)
Gruß, Joachim