Batteriestatus und Speicherung des letzten Wechsel

Begonnen von Amenophis86, 12 Januar 2018, 19:23:20

Vorheriges Thema - Nächstes Thema

gent

Ich habe mal eine wahrscheinlich dumme Frage:

Muss ich in den Devices, bei denen ich den Batteriestand überwachen will das attribut "event-on-change-reading" passend setzen?

Liebe Grüße vom Gent
fhem auf rPi3 mit USB boot und M2, cul866 (hm), homebridge, FlowerSens, Shelly, Harmony, WemosD1, Sonoff/Tasmota, grafana, mqtt/mosquitto

MadMax-FHEM

Zitat von: gent am 25 August 2021, 18:41:38
Ich habe mal eine wahrscheinlich dumme Frage:

Muss ich in den Devices, bei denen ich den Batteriestand überwachen will das attribut "event-on-change-reading" passend setzen?

Liebe Grüße vom Gent

Naja: wenn z.B. nie ein battery-etc-Event kommt, dann kommt auch nie ein Eintrag bzw. halt nur geänderte Einträge.

Wo es eh nur ok/low gibt ist es wohl egal, also bzw. event-on-change... sollte zumindest diese beiden Events "ermöglichen"...
...bei Geräten/Devices die Zwischenwerte liefern sollten die halt kommen (können)...

Also es ist wie bei allen Events... ;)

EDIT: für die "Erstellung" einer "Erstansicht" sollten zumindest alle Devices mal ein Event "lostreten" ;)

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)

gent

Hallo Joachim,

also wenn ich im Event-Monitor für das Device z.B. so etwas sehe


2021-08-25 19:46:30 CUL_HM LA2.Heizung battery: ok
2021-08-25 19:46:30 CUL_HM LA2.Heizung batteryLevel: 2.7


Dann ist hier ein Event ausgelöst worden und ich brauche kein weiteres Attribut zu setzen. Sehe ich das richtig?
fhem auf rPi3 mit USB boot und M2, cul866 (hm), homebridge, FlowerSens, Shelly, Harmony, WemosD1, Sonoff/Tasmota, grafana, mqtt/mosquitto

MadMax-FHEM

#333
Zitat von: gent am 25 August 2021, 19:48:04
Hallo Joachim,

also wenn ich im Event-Monitor für das Device z.B. so etwas sehe


2021-08-25 19:46:30 CUL_HM LA2.Heizung battery: ok
2021-08-25 19:46:30 CUL_HM LA2.Heizung batteryLevel: 2.7


Dann ist hier ein Event ausgelöst worden und ich brauche kein weiteres Attribut zu setzen. Sehe ich das richtig?

Zumindest wird so immer aktualisiert.
Je nachdem wie oft das kommt (und wie oft du eine Aktualisierung wirklich brauchst) kannst du nat. event-on-change-... setzen.

Wenn dir z.B. EINE Nachricht bei LEER reicht und du auch sonst nicht auf battery-Events reagierst, dann kannst du mit event-on-change genau das erreichen.
Wenn dich wiederholte Benachrichtigungen stören, dann kannst du entweder event-on-change setzen oder eben bei der Benachrichtigung dafür sorgen, dass diese nur 1x kommt.
(wobei das nicht ganz stimmt, weil manche Geräte kurz vor leer u.U. noch [ein paar] mal hin und her wanken ;)  )

Andersrum: wenn du mehrfach auf eine leere Batterie hingewiesen werden willst, dann einfach event-on-change (für battery) weglassen (vorausgesetzt das Device/Gerät schickt weiterhin battery-Meldungen) oder eben in der Benachrichtigung bzw. dort wo diese erzeugt wird entsprechend für Wiederholungen sorgen...

Noch mal: es gibt keine Regel für event-on-change weil es eben davon abhängt, wie oft die Events kommen (zu oft unbenötigt -> einschränken u.U. sinnvoll) wenn sie eh nicht oft kommen (wie man dann eben will) und wenn man auch noch anderweitig drauf reagieren will, z.B. regelmäßig irgendwelche Automatismen oder auch "nur" prüfen "lebt das Ding noch", dann ist event-on-change eher/oft kontraproduktiv...

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)

DonJuan

Moin,

ich stehe da irgendwie auf dem Schlauch. Habe mir den Code vom Git kopiert und in mein FHEM eingebunden. Mit {BatteryStart()} wurde auch alles mögliche Angelegt. Aber es gibt keinen Inhalt im "rgBatteryStatus". Im "BatterieStatusBot" stehen zwar alle Devices drin, aber mit "none". Wenn ich den Code richtig verstehe, soll das beim ersten mal auch so sein. Nun ist aber eine Batterie leer und es passiert nichts.

Ich weiss, dass ich das Script schon mal benutzt hatte. Da wurde ich nur nicht gewarnt und der Wechseltag wurde nicht dokumentiert.

Ich finde leider den Fehler nicht. Evtl liegt es daran, dass meine Homematic-IP-Geräte alle "HmIP_...." heissen.

Kennt jemand das Problem?

Gruss Dennis

MadMax-FHEM

Poste doch mal ein list von einem deiner Devices und vom notify bzgl. Batterie.

Sind es HM-IP Geräte?
Klingt danach...

Sind die im Code der Sub überhaupt schon drin?
Gut, sieht man (evtl.) wenn man ein list hat/hätte...

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)

DonJuan

Moin Moin,

ja, es sind alles HM-IP-Geräte (und ein paar LaCrosse).
Ob die im Code mit drin sind, weiss ich nicht. Ich habe das einfach alles so übernommen. Auch, weil ich nicht wusste, wo ich was anpassen sollte.

Hier die List vom Device.

Internals:
   DEF        000A1A49A0C978
   FUUID      5e061613-f33f-42e4-0365-fa764823c7157fd1
   IODev      d_ccu
   NAME       HmIP_HZ_Buero
   NR         22
   STATE      20
   TYPE       HMCCUDEV
   ccuaddr    000A1A49A0C978
   ccudevstate active
   ccuif      HmIP-RF
   ccuname    HmIP-HZ-Buero
   ccurolectrl HEATING_CLIMATECONTROL_TRANSCEIVER
   ccurolestate HEATING_CLIMATECONTROL_TRANSCEIVER
   ccusubtype TRV
   ccutype    HmIP-eTRV-2
   firmware   2.2.8
   readonly   no
   sender     HmIP_FT_Buero
   READINGS:
     2021-12-03 09:36:28   1.ACTUAL_TEMPERATURE 21.3
     2021-12-03 09:36:28   1.ACTUAL_TEMPERATURE_STATUS NORMAL
     2021-12-03 09:36:28   1.BOOST_MODE    false
     2021-12-03 09:36:28   1.SET_POINT_MODE auto
     2021-12-03 09:36:28   1.SET_POINT_TEMPERATURE 20
     2021-12-03 09:36:28   1.WINDOW_STATE  closed
     2021-12-01 23:46:23   IODev           d_ccu
     2021-12-03 09:36:28   activity        alive
     2021-12-03 09:36:28   battery         ok
     2021-12-03 09:36:28   control         20
     2021-12-03 09:36:28   desired-temp    20
     2021-12-03 09:36:28   devstate        ok
     2021-12-03 09:36:28   hmstate         20
     2021-12-03 09:36:28   measured-temp   21.3
     2021-12-03 09:36:28   rssidevice      -72
     2021-12-03 09:36:28   rssipeer        186
     2021-12-03 09:36:28   state           20
     2021-12-03 09:36:28   valve_position  2
     2021-12-03 09:36:28   valve_position_STATUS NORMAL
   hmccu:
     channels   8
     detect     1
     devspec    000A1A49A0C978
     forcedev   0
     nodefaults 1
     role       0:MAINTENANCE,1:HEATING_CLIMATECONTROL_TRANSCEIVER,2:HEATING_CLIMATECONTROL_RECEIVER,3:HEATING_CLIMATECONTROL_CL_RECEIVER,4:HEATING_SHUTTER_CONTACT_RECEIVER,5:HEATING_ROOM_TH_TRANSCEIVER,6:HEATING_ROOM_TH_RECEIVER,7:HEATING_KEY_RECEIVER
     semDefaults 0
     cmdlist:
       get       
       set        boost:noArg desired-temp on:noArg auto:noArg off:noArg manu:noArg holiday:noArg toggle:noArg
     control:
       chn        1
       dpt        SET_POINT_TEMPERATURE
     dp:
       0.CONFIG_PENDING:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      false
           OVAL       0
           SVAL       false
           VAL        0
       0.DUTY_CYCLE:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      false
           OVAL       0
           SVAL       false
           VAL        0
       0.INSTALL_TEST:
         VALUES:
           NVAL       true
           ONVAL      true
           OSVAL      true
           OVAL       true
           SVAL       true
           VAL        true
       0.LOW_BAT:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      ok
           OVAL       0
           SVAL       ok
           VAL        0
       0.OPERATING_VOLTAGE:
         VALUES:
           NVAL       2.4
           ONVAL      2.4
           OSVAL      2.4
           OVAL       2.4
           SVAL       2.4
           VAL        2.4
       0.OPERATING_VOLTAGE_STATUS:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      NORMAL
           OVAL       0
           SVAL       NORMAL
           VAL        0
       0.RSSI_DEVICE:
         VALUES:
           NVAL       -72
           ONVAL      -72
           OSVAL      -72
           OVAL       -72
           SVAL       -72
           VAL        -72
       0.RSSI_PEER:
         VALUES:
           NVAL       186
           ONVAL      186
           OSVAL      186
           OVAL       186
           SVAL       186
           VAL        186
       0.UNREACH:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      alive
           OVAL       0
           SVAL       alive
           VAL        0
       0.UPDATE_PENDING:
         VALUES:
           NVAL       false
           ONVAL      false
           OSVAL      false
           OVAL       false
           SVAL       false
           VAL        false
       1.ACTIVE_PROFILE:
         VALUES:
           NVAL       1
           ONVAL      1
           OSVAL      1
           OVAL       1
           SVAL       1
           VAL        1
       1.ACTUAL_TEMPERATURE:
         VALUES:
           NVAL       21.3
           ONVAL      21.3
           OSVAL      21.3
           OVAL       21.3
           SVAL       21.3
           VAL        21.3
       1.ACTUAL_TEMPERATURE_STATUS:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      NORMAL
           OVAL       0
           SVAL       NORMAL
           VAL        0
       1.BOOST_MODE:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      false
           OVAL       0
           SVAL       false
           VAL        0
       1.BOOST_TIME:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      0
           OVAL       0
           SVAL       0
           VAL        0
       1.FROST_PROTECTION:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      false
           OVAL       0
           SVAL       false
           VAL        0
       1.LEVEL:
         VALUES:
           NVAL       2
           ONVAL      1
           OSVAL      1
           OVAL       0.01
           SVAL       2
           VAL        0.02
       1.LEVEL_STATUS:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      NORMAL
           OVAL       0
           SVAL       NORMAL
           VAL        0
       1.PARTY_MODE:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      false
           OVAL       0
           SVAL       false
           VAL        0
       1.PARTY_SET_POINT_TEMPERATURE:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      0
           OVAL       0.000000
           SVAL       0
           VAL        0.000000
       1.PARTY_TIME_END:
         VALUES:
           NVAL       
           ONVAL     
           OSVAL     
           OVAL       
           SVAL       
           VAL       
       1.PARTY_TIME_START:
         VALUES:
           NVAL       
           ONVAL     
           OSVAL     
           OVAL       
           SVAL       
           VAL       
       1.QUICK_VETO_TIME:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      0
           OVAL       0
           SVAL       0
           VAL        0
       1.SET_POINT_MODE:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      auto
           OVAL       0
           SVAL       auto
           VAL        0
       1.SET_POINT_TEMPERATURE:
         VALUES:
           NVAL       20
           ONVAL      20
           OSVAL      20
           OVAL       20.0
           SVAL       20
           VAL        20.0
       1.SWITCH_POINT_OCCURED:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      false
           OVAL       0
           SVAL       false
           VAL        0
       1.VALVE_ADAPTION:
         VALUES:
           NVAL       false
           ONVAL      false
           OSVAL      false
           OVAL       false
           SVAL       false
           VAL        false
       1.VALVE_STATE:
         VALUES:
           NVAL       4
           ONVAL      4
           OSVAL      ADAPTION_DONE
           OVAL       4
           SVAL       ADAPTION_DONE
           VAL        4
       1.WINDOW_STATE:
         VALUES:
           NVAL       0
           ONVAL      0
           OSVAL      closed
           OVAL       0
           SVAL       closed
           VAL        0
     roleCmds:
       get:
       set:
         auto:
           channel    1
           role       HEATING_CLIMATECONTROL_TRANSCEIVER
           subcount   1
           syntax     V:CONTROL_MODE:0
           usage      auto
           subcmd:
             000:
               args       0
               dpt        CONTROL_MODE
               fnc       
               max        3
               min        0
               parname    CONTROL_MODE
               partype    3
               ps         VALUES
               scn        000
               unit       
         boost:
           channel    1
           role       HEATING_CLIMATECONTROL_TRANSCEIVER
           subcount   1
           syntax     V:BOOST_MODE:1
           usage      boost
           subcmd:
             000:
               args       1
               dpt        BOOST_MODE
               fnc       
               max        1
               min        0
               parname    BOOST_MODE
               partype    3
               ps         VALUES
               scn        000
               unit       
         desired-temp:
           channel    1
           role       HEATING_CLIMATECONTROL_TRANSCEIVER
           subcount   1
           syntax     V:SET_POINT_TEMPERATURE:?temperature
           usage      desired-temp temperature
           subcmd:
             000:
               args       
               dpt        SET_POINT_TEMPERATURE
               fnc       
               max        30.5
               min        4.5
               parname    temperature
               partype    2
               ps         VALUES
               scn        000
               unit       �C
         holiday:
           channel    1
           role       HEATING_CLIMATECONTROL_TRANSCEIVER
           subcount   1
           syntax     V:CONTROL_MODE:2
           usage      holiday
           subcmd:
             000:
               args       2
               dpt        CONTROL_MODE
               fnc       
               max        3
               min        0
               parname    CONTROL_MODE
               partype    3
               ps         VALUES
               scn        000
               unit       
         manu:
           channel    1
           role       HEATING_CLIMATECONTROL_TRANSCEIVER
           subcount   1
           syntax     V:CONTROL_MODE:1
           usage      manu
           subcmd:
             000:
               args       1
               dpt        CONTROL_MODE
               fnc       
               max        3
               min        0
               parname    CONTROL_MODE
               partype    3
               ps         VALUES
               scn        000
               unit       
         off:
           channel    1
           role       HEATING_CLIMATECONTROL_TRANSCEIVER
           subcount   2
           syntax     V:CONTROL_MODE:1 V:SET_POINT_TEMPERATURE:4.5
           usage      off
           subcmd:
             000:
               args       1
               dpt        CONTROL_MODE
               fnc       
               max        3
               min        0
               parname    CONTROL_MODE
               partype    3
               ps         VALUES
               scn        000
               unit       
             001:
               args       4.5
               dpt        SET_POINT_TEMPERATURE
               fnc       
               max        30.5
               min        4.5
               parname    SET_POINT_TEMPERATURE
               partype    3
               ps         VALUES
               scn        001
               unit       �C
         on:
           channel    1
           role       HEATING_CLIMATECONTROL_TRANSCEIVER
           subcount   2
           syntax     V:CONTROL_MODE:1 V:SET_POINT_TEMPERATURE:30.5
           usage      on
           subcmd:
             000:
               args       1
               dpt        CONTROL_MODE
               fnc       
               max        3
               min        0
               parname    CONTROL_MODE
               partype    3
               ps         VALUES
               scn        000
               unit       
             001:
               args       30.5
               dpt        SET_POINT_TEMPERATURE
               fnc       
               max        30.5
               min        4.5
               parname    SET_POINT_TEMPERATURE
               partype    3
               ps         VALUES
               scn        001
               unit       �C
     state:
       chn        1
       dpt        SET_POINT_TEMPERATURE
Attributes:
   IODev      d_ccu
   ccureadingfilter ^ACTUAL_TEMPERATURE|^BOOST_MODE|^SET_POINT_MODE|^SET_POINT_TEMPERATURE|^LEVEL|^WINDOW_STATE
   ccureadingname 1.LEVEL:valve_position
   ccuscaleval LEVEL:0:1:0:100
   cmdIcon    auto:sani_heating_automatic manu:sani_heating_manual boost:sani_heating_boost on:general_an off:general_aus
   controldatapoint 1.SET_POINT_TEMPERATURE
   event-on-change-reading .*
   eventMap   /datapoint 1.BOOST_MODE true:Boost/datapoint 1.CONTROL_MODE 0:Auto/datapoint 1.CONTROL_MODE 1:Manual/datapoint 1.CONTROL_MODE 2:Holiday/datapoint 1.CONTROL_MODE 1 1.SET_POINT_TEMPERATURE 4.5:off/datapoint 1.CONTROL_MODE 0 1.SET_POINT_TEMPERATURE 30.5:on/
   group      Buero
   room       Homematic,Wohnung
   statedatapoint 1.SET_POINT_TEMPERATURE
   stripnumber 1
   substexcl  desired-temp
   substitute SET_POINT_TEMPERATURE!#0-4.5:off,#30.5-40:on;WINDOW_STATE!(0|false):closed,(1|true):open
   verbose    5
   webCmd     desired-temp:auto:manu:boost:on:off
   widgetOverride desired-temp:slider,4.5,0.5,30.5,1


Und hier vom Notify

Internals:
   CFGFN     
   DEF        .*:battery.* {BatteryStatusFunction($NAME, $EVENT)}
   FUUID      61a94728-f33f-42e4-fed5-f0af2a86869cfa9b
   NAME       NO.BatterieNotify
   NR         558
   NTFY_ORDER 50-NO.BatterieNotify
   REGEXP     .*:battery.*
   STATE      2021-12-03 10:12:16
   TRIGGERTIME 1638522736.84415
   TYPE       notify
   READINGS:
     2021-12-02 23:22:32   state           active
Attributes:
   room       BatteryCheck


Bin mal gespannt, was ich falsch gemacht habe.

Gruss Dennis

MadMax-FHEM

Also wie ich dachte: (noch) nicht drin :-\
(zumindest der Typ von dem das list ist: mal von einem der anderen Devices [LaCrosse] auch ein list aber ich vermute auch da: [noch] nicht drin)

Du kannst mal folgendes machen:

Zitat von: BatteryStatusFunction
################################
# Here you choos your message device and how to send
# comment the device you do not want to use
#
# TelegramBot
  my $msg = "set TelegramBot message \@\@User ";
#
# msg-command
# my $msg = "msg \@User title='Battery Check' ";
#
# Pushover
# my $msg = "set Pushover msg device=User title='Battery Check' ";


 
#  Log3(undef, 1, "my_StoreBatteryStatus      Device: $Device       Event: $Event      Model: $Model");
 
  # ignoring Devices that were just created by autocreate
  if($DeviceNameParts[0] eq "HM" || $DeviceNameParts[0] eq "ZWave" || $DeviceNameParts[0] eq "MAX")
  {
    Log3(undef, 1, "my_StoreBatteryStatus      ignoring Device: $Device");
    return;
  }

mal das was rot ist wegmachen, also nur das '#' also sodass die Logausgabe wieder erfolgt ;)

Dann mal eine zeitlang laufen lassen, es sollten halt von ein paar der Devices auch Batterie-Events kommen...

Und dann mal DIESE Logeinträge posten (wobei in Model verm. "undef" stehen wird)...

Ich kann (dann) versuchen mal die HMCCU-Devices auch "reinzubasteln"...
...und falls ein list von einem LaCrosse kommt die auch...
...in der Hoffnung, dass ich den Code (noch) verstehe ;)

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)

MadMax-FHEM

#338
So ich hab mal was "gebastelt":


  ##############################################
  # HMCCU Devices
  ##############################################
elsif($BatteryType[0] eq "battery"  && (InternalVal($Device, "TYPE", "undef") eq "HMCCUDEV" || InternalVal($Device, "TYPE", "undef") eq "LaCrosse"))
  {
    if(ReadingsVal($Device, "battery", "low") eq "ok")
    {
      # check if battery was low before -> possibly changed
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") eq "low" || ReadingsVal($BatteryStatus, $Device, 100) < 25)
      {
        # set date/time for changed battery if it was low before (so probably a change happended)
        fhem("setreading $BatteryChanged $Device $text_changed");
        # set the signal state back to none
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }

      # status is "ok" so we set to 100% (we don't know better)
      fhem("setreading $BatteryStatus $Device 100");
    }
    else
    {
      # check if message was already sent
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "low")
      {
        # set signal state to low
        fhem("setreading $BatteryStatusBot $SignalDevice low");
        #send message via TelegramBot
        fhem($msg." ".$text_soon);
      }

      # status is NOT "ok" ("low") so we set to 0% (we don't know better)
      fhem("setreading $BatteryStatus $Device 0");
    }
  }


das einfach mal ans Ende, also nach dem MAX!-Eintrag "dranbasteln" und dann mal sehen...

EDIT: sollte jetzt auch mit LaCrosse funktionieren... Also sofern das mit HMCCU geht/ging ;)

Eventuell (Code ist halt [auch bei mir] schwer "gewachsen") sollte/könnte man auch die eigentlich gar nicht unterschiedlichen Devices (also Reading battery und da dann ok/nok) mal zusammenfassen...
...und nur gegenüber Devices unterscheiden, die zwar battery im Reading haben aber da eben z.B. "Prozentwerte" etc. stehen haben...

Unsicher (da ich keine habe und auch HMCCU wenig kenne) bin ich halt bzgl. der "Sonderlocke" HMCCUDEV, also ob das dann tatsächlich "allgemein" für HMCCU Devices gilt oder ob es da weitere/andere "Spezialitäten" gibt...

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)

DonJuan

#339
Ich danke euch.

Ich werde mir eure Beiträge heute Abend nochmal in Ruhe angucken.

Hier aber noch das Listing von einem LaCrosse-Geräte

Internals:
   DEF        05
   FUUID      6182a1ac-f33f-42e4-0408-8526c2d1ecb7c920
   IODev      myJeeLink
   LASTInputDev myJeeLink
   LaCrosse_lastRcv 2021-12-03 15:39:16
   MSGCNT     8377
   NAME       T.Buero
   NR         123
   STATE      T: 19.5 H: 45
   TYPE       LaCrosse
   addr       05
   battery_new 0
   bufferedH 
   bufferedT 
   corr1      0
   corr2      0
   myJeeLink_MSGCNT 8377
   myJeeLink_RAWMSG OK 9 5 1 4 171 45
   myJeeLink_TIME 2021-12-03 15:39:16
   previousH  45
   previousT  19.5
   sensorType 0=T(H)
   READINGS:
     2021-12-01 23:46:24   IODev           myJeeLink
     2021-12-03 15:39:16   battery         ok
     2021-12-03 15:39:16   humidity        45
     2021-12-03 15:32:01   state           T: 19.5 H: 45
     2021-12-03 15:39:16   temperature     19.5
Attributes:
   IODev      myJeeLink
   group      Buero
   room       LaCrosse,Wohnung


Nachtrag: Hier der LogfileAuszug

021.12.03 16:11:43 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:11:47 1: my_StoreBatteryStatus      Device: T.Gast       Event: battery: ok      Model: undef
2021.12.03 16:11:48 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:11:50 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:11:51 1: my_StoreBatteryStatus      Device: T.Buero       Event: battery: ok      Model: undef
2021.12.03 16:11:53 1: my_StoreBatteryStatus      Device: T.Schlaf       Event: battery: ok      Model: undef
2021.12.03 16:12:01 1: my_StoreBatteryStatus      Device: T.Buero       Event: battery: ok      Model: undef
2021.12.03 16:12:03 1: my_StoreBatteryStatus      Device: T.Schlaf       Event: battery: ok      Model: undef
2021.12.03 16:12:11 1: my_StoreBatteryStatus      Device: T.Buero       Event: battery: ok      Model: undef
2021.12.03 16:12:13 1: my_StoreBatteryStatus      Device: T.Schlaf       Event: battery: ok      Model: undef
2021.12.03 16:12:23 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:12:27 1: my_StoreBatteryStatus      Device: T.Gast       Event: battery: ok      Model: undef
2021.12.03 16:12:28 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:12:30 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:12:33 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:12:34 1: my_StoreBatteryStatus      Device: HmIP_HZ_Wohnzimmer       Event: battery: low      Model: undef
2021.12.03 16:12:35 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:12:36 1: my_StoreBatteryStatus      Device: HmIP_FT_Gaestezimmer       Event: battery: ok      Model: undef
2021.12.03 16:12:36 1: my_StoreBatteryStatus      Device: HmIP_FT_Gaestezimmer       Event: battery: ok      Model: undef
2021.12.03 16:12:37 1: my_StoreBatteryStatus      Device: T.Gast       Event: battery: ok      Model: undef
2021.12.03 16:12:38 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:12:40 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:12:43 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:12:45 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:12:47 1: my_StoreBatteryStatus      Device: T.Gast       Event: battery: ok      Model: undef
2021.12.03 16:12:48 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:12:51 1: my_StoreBatteryStatus      Device: T.Buero       Event: battery: ok      Model: undef
2021.12.03 16:12:53 1: my_StoreBatteryStatus      Device: T.Schlaf       Event: battery: ok      Model: undef
2021.12.03 16:13:01 1: my_StoreBatteryStatus      Device: T.Buero       Event: battery: ok      Model: undef
2021.12.03 16:13:03 1: my_StoreBatteryStatus      Device: T.Schlaf       Event: battery: ok      Model: undef
2021.12.03 16:13:11 1: my_StoreBatteryStatus      Device: T.Buero       Event: battery: ok      Model: undef
2021.12.03 16:13:13 1: my_StoreBatteryStatus      Device: T.Schlaf       Event: battery: ok      Model: undef
2021.12.03 16:13:21 1: my_StoreBatteryStatus      Device: HmIP_STHD_Wohnzimmer       Event: battery: ok      Model: undef
2021.12.03 16:13:22 1: my_StoreBatteryStatus      Device: HmIP_STHD_Schlafzimmer       Event: battery: ok      Model: undef
2021.12.03 16:13:23 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:13:25 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:13:27 1: my_StoreBatteryStatus      Device: T.Gast       Event: battery: ok      Model: undef
2021.12.03 16:13:30 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:13:33 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:13:35 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:13:37 1: my_StoreBatteryStatus      Device: T.Gast       Event: battery: ok      Model: undef
2021.12.03 16:13:40 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:13:43 1: my_StoreBatteryStatus      Device: T.Wohn       Event: battery: ok      Model: undef
2021.12.03 16:13:47 1: my_StoreBatteryStatus      Device: T.Gast       Event: battery: ok      Model: undef
2021.12.03 16:13:50 1: my_StoreBatteryStatus      Device: T.Bad       Event: battery: ok      Model: undef
2021.12.03 16:13:51 1: my_StoreBatteryStatus      Device: T.Buero       Event: battery: ok      Model: undef
2021.12.03 16:13:53 1: my_StoreBatteryStatus      Device: T.Schlaf       Event: battery: ok      Model: undef
2021.12.03 16:14:01 1: my_StoreBatteryStatus      Device: T.Buero       Event: battery: ok      Model: undef
2021.12.03 16:14:03 1: my_StoreBatteryStatus      Device: T.Schlaf       Event: battery: ok      Model: undef
2021.12.03 16:14:11 1: my_StoreBatteryStatus      Device: T.Buero       Event: battery: ok      Model: undef
2021.12.03 16:14:13 1: my_StoreBatteryStatus      Device: T.Schlaf       Event: battery: ok      Model: undef
2021.12.03 16:14:14 1: my_StoreBatteryStatus      Device: HmIP_AT_Balkon       Event: battery: ok      Model: undef
2021.12.03 16:14:14 1: my_StoreBatteryStatus      Device: HmIP_AT_Balkon       Event: battery: ok      Model: undef

MadMax-FHEM

#340
Ok, habe LaCrosse auch mal integriert (so ich denek)...
...also obigen Code angepasst/erweitert.

Bin gespannt, ob es tut...

Logausgaben wie erwartet... 8)

EDIT: du kannst nun das '#' wieder vor die Logzeile machen ;)

EDIT: ich weiß nicht, ob Amenophis86 das hier noch pflegt. Evtl. schaue ich mal noch mal drüber (da kann man bestimmt einiges vereinfachen/zusammenfassen) und melde das auf GIT irgendwie...

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)

DonJuan

Vielen Dank, Joachim. Eingespielt und schon tauchten die Geräte auf.

Jetzt muss ich mal abwarten und gucken, wann die "schwache" Batterie angezeigt wird. Im Moment behauptet das System noch, dass die Batterien i. O. sind.

Gruss Dennis

MadMax-FHEM

Zitat von: DonJuan am 03 Dezember 2021, 20:44:57
Vielen Dank, Joachim. Eingespielt und schon tauchten die Geräte auf.

Jetzt muss ich mal abwarten und gucken, wann die "schwache" Batterie angezeigt wird. Im Moment behauptet das System noch, dass die Batterien i. O. sind.

Gruss Dennis

Schön, freut mich! :)

Du kannst die Nachricht ja simulieren:


setreading Devicename battery low


also z.B.:

setreading T.Buero battery low

Wird ja mit dem nächsten Update wieder "korrigiert"...

WOBEI: ich bin halt mal von "ok" und "low" ausgegangen... Wenn die Geräte andere "Werte" liefern, dann muss ich "nachbessern" und du mir nat. mitteilen was bei "leerer Batterie" im reading steht...

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)

Amenophis86

Danke Joachim fürs übernehmen. Da ich bei mir mit dem neuen Haus auf KNX umgestellt habe, habe ich hier sehr wenig gemacht und aktuell andere Prios. Sollte sich jemand anbieten können wir den Thread gerne schließen und auf eine neue Version verweisen, die weiter gepflegt wird.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

DonJuan

#344
So, ein "kleiner" Fehler war noch drin. Jedenfalls hatte ich eine "}" zuviel. Daher funktionierte die Benachrichtigung per Telegram nicht. Ansonsten funktioniert es nun.

Ich kopiere hier mal den ganzen Code rein. So für den Fall der Fälle.
Danke nochmal.

#########################################################################
# Helper for readingsGroup BatteryStatus:
# reads the battery states of devices and
# calculates the battery state in percent (depending on device type) and
# stores it as reading in corresponding dummy device
sub BatteryStatusFunction($$)
{
  my ($Device, $Event)  = @_;
  my @BatteryType = split(/:/,$Event); # to distinguish between "battery" and "batteryLevel" devices
  my $Model = AttrVal($Device, "model", "undef"); # get the corresponding model type
  my $TYPE = InternalVal($Device, "TYPE", "undef"); # MAX!
  my $ActBatLevel = 0.0;
  my $MinBatLevel = 0.0;
  my $RemainingVoltageQuater = 0.0; # for "calculating" the colors
  my $MaxBattery = 3.1; # two 1.5V batteries have a measured voltage of 3.1V or even 3.2V
  my @DeviceNameParts = split(/_/,$Device); # to filter out HM_ Devices from neighbor or test system or newly included ones
  my $SignalDevice = $Device . "_BatState";

###############################
# Here you can change the variables to fit your installation.
#
  my $text_now = "Die Batterien von $Device müssen JETZT gewechselt werden!"; #Text for changing battery now
  my $text_soon = "Die Batterien von $Device sollten bald gewechselt werden!"; #Text for changing battery soon
  my $text_changed = "Batterie zuletzt gewechselt: "; #Text for last change
  my $BatteryStatus = "BatterieStatus"; #Name of the Dummy for status
  my $BatteryStatusBot = "BatterieStatusBot"; #Name of the Dummy for status of send messages
  my $BatteryChanged = "BatterieWechsel"; #Name of the Dummy for battery changed information

################################
# Here you choos your message device and how to send
# comment the device you do not want to use
#
# TelegramBot
  my $msg = "set TelegramBot message \@\@User ";
#
# msg-command
# my $msg = "msg \@User title='Battery Check' ";
#
# Pushover
# my $msg = "set Pushover msg device=User title='Battery Check' ";


 
# Log3(undef, 1, "my_StoreBatteryStatus      Device: $Device       Event: $Event      Model: $Model");
 
  # ignoring Devices that were just created by autocreate
  #if($DeviceNameParts[0] eq "HM" || $DeviceNameParts[0] eq "ZWave" || $DeviceNameParts[0] eq "MAX")
  #{
  #  Log3(undef, 1, "my_StoreBatteryStatus      ignoring Device: $Device");
  #  return;
  #}

  # if it is the first time for that device set it to none (initialize)
  if(ReadingsVal($BatteryStatusBot, $SignalDevice, "undef") eq "undef")
  {
    fhem("setreading $BatteryStatusBot $SignalDevice none");
  }
   
  # actually only devices HM-TC-IT-WM-W-EU and HM-CC-RT-DN have battery level and min-level
  # so calculating the percentage of actual level depending on min-level
  # all others just have battery ok or nok
  # IMPORTANT: first filter those which only send "battery" in EVENT
  #            then calculate for those which send "batteryLevel"!
  #            New devices: ZWave. They deliver battery already in percentage.
  #            New devices: XiaomiFlowerSens. They also deliver batteryLevel but already in percentage.

  ##############################################
  # HM Devices with battery
  ##############################################
  if($BatteryType[0] eq "battery"  && $Model ne "HM-TC-IT-WM-W-EU" && $Model ne "HM-CC-RT-DN" && $Model ne "undef")
  {
    if(ReadingsVal($Device, "battery", "low") eq "ok")
    {
      # check if battery was low before -> possibly changed
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") eq "low" || ReadingsVal($BatteryStatus, $Device, 100) < 25)
      {
        # set date/time for changed battery if it was low before (so probably a change happended)
        fhem("setreading $BatteryChanged $Device $text_changed");
        # set the signal state back to none
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }

      # status is "ok" so we set to 100% (we don't know better)
      fhem("setreading $BatteryStatus $Device 100");
    }
    else
    {
      # check if message was already sent
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "low")
      {
        # set signal state to low
        fhem("setreading $BatteryStatusBot $SignalDevice low");
        #send message via TelegramBot
        fhem($msg." ".$text_soon);
      }

      # status is NOT "ok" ("low") so we set to 0% (we don't know better)
      fhem("setreading $BatteryStatus $Device 0");
    }
  }
  ##############################################
  # HM Devices with batteryLevel
  ##############################################
  elsif($BatteryType[0] eq "batteryLevel"  && $Model ne "undef")
  {
    $ActBatLevel = ReadingsVal($Device, "batteryLevel", "0.0");
    $MinBatLevel = ReadingsNum($Device, "R-lowBatLimitRT", "0.0");
    $RemainingVoltageQuater = ($MaxBattery - $MinBatLevel) / 4; # to get 4 quaters for different colours and icons

    if(($ActBatLevel - $MinBatLevel) > (3 * $RemainingVoltageQuater))
    {
      # check if battery was low before -> possibly changed
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") eq "low" || ReadingsVal($BatteryStatus, $Device, 100) < 25)
      {
        # set date/time for changed battery if it was low before (so probably a change happended)
        fhem("setreading $BatteryChanged $Device $text_changed");
        # set the signal state back to none
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }

      # set battery value to 100%
      fhem("setreading $BatteryStatus $Device 100");
    }
    elsif(($ActBatLevel - $MinBatLevel) > (2 * $RemainingVoltageQuater))
    {
      # between 50% and 75%
      fhem("setreading $BatteryStatus $Device 75");

      # set the signal state back to none
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "none")
      {
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }
    }
    elsif(($ActBatLevel - $MinBatLevel) > (1 * $RemainingVoltageQuater))
    {
      # between 25% and 50%
      fhem("setreading $BatteryStatus $Device 50");

      # set the signal state back to none
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "none")
      {
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }
    }
    elsif(($ActBatLevel - $MinBatLevel) > (0 * $RemainingVoltageQuater))
    {
      # check for critical stuff
      if(ReadingsVal($Device, "motorErr", "ok") eq "lowBat" || ReadingsVal($Device, "motorErr", "ok") eq "ValveErrorPosition")
      {
        # empty!
        fhem("setreading $BatteryStatus $Device 0");
        # check if message was already sent
        if(ReadingsVal($BatteryStatusBot, $SignalDevice, "low") ne "low")
        {
          # set signal state to low
          fhem("setreading $BatteryStatusBot $SignalDevice low");
          #send message via TelegramBot
          if(ReadingsVal($Device, "motorErr", "ok") eq "ValveErrorPosition")
          {
            fhem($msg." ".$text_now);
          }
          else
          {
            fhem($msg." ".$text_soon);
          }
        }
      }
      else
      {
        # between 0% and 25%
        fhem("setreading $BatteryStatus $Device 25");
      }
    }
    else
    {
      # totally empty
      fhem("setreading $BatteryStatus $Device 0");

      # check if message was already sent
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "low") ne "low")
      {
        # set signal state to low
        fhem("setreading $BatteryStatusBot $SignalDevice low");
        #send message via TelegramBot
        fhem($msg." ".$text_soon);
      }
    }
  }
  ##############################################
  # ZWave Devices
  ##############################################
elsif($BatteryType[0] eq "battery"  && InternalVal($Device, "TYPE", "undef") eq "ZWave")
{
   if(ReadingsVal($Device, "battery", "na") eq "low")
{
     $ActBatLevel = 0;
}
else
{
    $ActBatLevel = ReadingsNum($Device, "battery", "0");
}

   if($ActBatLevel > 75)
   {
     # set date/time for changed battery if it was low before (so probably a change happended)
     if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") eq "low" || ReadingsVal($BatteryStatus, $Device, 100) < 25)
     {
       fhem("setreading $BatteryChanged $Device $text_changed");
     }

     # set the battery value to 75% - 100%
     fhem("setreading $BatteryStatus $Device 100");

     # set the signal state back to none
     fhem("setreading $BatteryStatusBot $SignalDevice none");
   }
   elsif($ActBatLevel > 50)
   {
    # between 50% and 75%
     fhem("setreading $BatteryStatus $Device 75");

     # set the signal state back to none
     if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "none")
     {
       fhem("setreading $BatteryStatusBot $SignalDevice none");
     }
   }
   elsif($ActBatLevel > 25)
   {
     # between 25% and 50%
     fhem("setreading $BatteryStatus $Device 50");

     # set the signal state back to none
     if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "none")
     {
       fhem("setreading $BatteryStatusBot $SignalDevice none");
     }
   }
   elsif($ActBatLevel > 5)
   {
     # between 5% and 25%
     fhem("setreading $BatteryStatus $Device 25");

     # maybe already send a message! Easy possible with new signal states
   }
   else
   {
  # TODO: test for 0 and then send "change NOW"!
  # TODO: test for 0 and then send "change NOW"!
  # TODO: test for 0 and then send "change NOW"!
  # TODO: test for 0 and then send "change NOW"!
  # TODO: test for 0 and then send "change NOW"!
     # totally empty (below 5%)
     fhem("setreading $BatteryStatus $Device 0");

     # check if message was already sent
     if(ReadingsVal($BatteryStatusBot, $SignalDevice, "low") ne "low")
     {
       # set signal state to low
       fhem("setreading $BatteryStatusBot $SignalDevice low");
       #send message via TelegramBot
       fhem($msg." ".$text_soon);
     }
   }
}
  #############################################
  # XiaomiFlowerSens Devices
  #############################################
elsif($BatteryType[0] eq "batteryLevel"  && InternalVal($Device, "TYPE", "undef") eq "XiaomiFlowerSens")
{
   $ActBatLevel = ReadingsNum($Device, "batteryLevel", "0");

   if($ActBatLevel > 75)
   {
     # set date/time for changed battery if it was low before (so probably a change happended)
     if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") eq "low" || ReadingsVal($BatteryStatus, $Device, 100) < 25)
      {
        fhem("setreading $BatteryChanged $Device $text_changed");
      }

      # set the battery value to 75% - 100%
      fhem("setreading $BatteryStatus $Device 100");

      # set the signal state back to none
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "none")
      {
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }
    }
    elsif($ActBatLevel > 50)
    {
      # between 50% and 75%
      fhem("setreading $BatteryStatus $Device 75");

      # set the signal state back to none
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "none")
      {
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }
    }
    elsif($ActBatLevel > 25)
    {
      # between 25% and 50%
      fhem("setreading $BatteryStatus $Device 50");

      # set the signal state back to none
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "none")
      {
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }
    }
    elsif($ActBatLevel > 5)
    {
      # between 5% and 25%
      fhem("setreading $BatteryStatus $Device 25");

      # maybe already send a message! Easy possible with new signal states
    }
    else
    {
      # totally empty (below 5%)
      fhem("setreading $BatteryStatus $Device 0");

      # check if message was already sent
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "low") ne "low")
      {
        # set signal state to low
        fhem("setreading $BatteryStatusBot $SignalDevice low");
        #send message via TelegramBot
        fhem($msg." ".$text_soon);
      }
    }
  }
 
  ##############################################
  # MAX! Devices
  ##############################################
  elsif(($BatteryType[0] eq "battery")  && ($TYPE eq "MAX"))
  {
    if(ReadingsVal($Device, "battery", "low") eq "ok")
    {
      # check if battery was low before -> possibly changed
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") eq "low")
      {
        # set date/time for changed battery if it was low before (so probably a change happended)
        fhem("setreading $BatteryChanged $Device $text_changed");
        # set the signal state back to none
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }

      # status is "ok" so we set to 100% (we don't know better)
      fhem("setreading $BatteryStatus $Device 100");
    }
    else
    {
      # check if message was already sent
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "low")
      {
        # set signal state to low
        fhem("setreading $BatteryStatusBot $SignalDevice low");
        #send message via TelegramBot
        fhem($msg." ".$text_soon);
      }

      # status is NOT "ok" ("low") so we set to 0% (we don't know better)
      fhem("setreading $BatteryStatus $Device 0");
    }
  }
   ##############################################
  # HMCCU Devices
  ##############################################
elsif($BatteryType[0] eq "battery"  && (InternalVal($Device, "TYPE", "undef") eq "HMCCUDEV" || InternalVal($Device, "TYPE", "undef") eq "LaCrosse"))
  {
    if(ReadingsVal($Device, "battery", "low") eq "ok")
    {
      # check if battery was low before -> possibly changed
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") eq "low" || ReadingsVal($BatteryStatus, $Device, 100) < 25)
      {
        # set date/time for changed battery if it was low before (so probably a change happended)
        fhem("setreading $BatteryChanged $Device $text_changed");
        # set the signal state back to none
        fhem("setreading $BatteryStatusBot $SignalDevice none");
      }

      # status is "ok" so we set to 100% (we don't know better)
      fhem("setreading $BatteryStatus $Device 100");
    }
    else
    {
      # check if message was already sent
      if(ReadingsVal($BatteryStatusBot, $SignalDevice, "none") ne "low")
      {
        # set signal state to low
        fhem("setreading $BatteryStatusBot $SignalDevice low");
        #send message via TelegramBot
        fhem($msg." ".$text_soon);
      }

      # status is NOT "ok" ("low") so we set to 0% (we don't know better)
      fhem("setreading $BatteryStatus $Device 0");
    }
  }


##################################################
# Helper for readingsGroup BatteryStatus:
# sets the icon and icon color depending on "calculated" percentage value
sub SetBatterieIcon($$)
{
  my ($Device, $Value)  = @_;
  my $Icon = "measure_battery_" . "$Value"; # here the matching icon is "set"
  my $ActionDetectorDevice = "status_" . $Device;
  my $Name = ""; # name for signal state
  my $State = ReadingsVal("ActionDetector", $ActionDetectorDevice, "alive");

#  Log3(undef, 1, "my_SetBatteryIcon      Device: $Device       Value: $Value");

  if($State ne "alive")
  {
    $Icon = "message_attention\@red";
  }
  else
  {
    if($Value > 75)
    {
      $Icon = $Icon . "\@green"; # between 75% and 100%
    }
    elsif($Value > 25)
    {
      $Icon = $Icon . "\@orange"; # between 25% and 75%
    }
    else
    {
      $Icon = $Icon . "\@red"; # below 25%
    }
  }

  return $Icon;
}
}


Eine letzte Frage: Zum Senden mit Telegram steht in dem Code "\@\@User". Aber wenn ich da "\@\@<msgChat>" eintrage, dann bekomme ich im Log einen Fehler. Schreibe ich aber "\@<msgChatID>" dann funktioniert es. Ist das so richtig? Oder was versteht ihr unter
ZitatHier muss lediglich das Wort "User" durch den TelegramNamen des Empfängers geändert werden.