[Gelöst]Benutzung von $NAME und $EVENT in AT funktion mit SignalBot

Begonnen von Kohle77, 17 Oktober 2022, 07:53:30

Vorheriges Thema - Nächstes Thema

Kohle77

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

MadMax-FHEM

#1
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Adimarantis

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
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Kohle77

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

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kohle77

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

MadMax-FHEM

#6
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Adimarantis

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.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Kohle77

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
aber der passt zu meinen devices auch nicht.

Vielen Dank
Gruß
Christian

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

MadMax-FHEM

#10
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
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Adimarantis

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.




Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Kohle77

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

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kohle77

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