Batteriestatus und Speicherung des letzten Wechsel

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

Vorheriges Thema - Nächstes Thema

Christoph Morrison


Madstar2409

Danke für den Hinweis aber um ehrlich zu sein hilft mir das bei meinen Problem nicht weiter. Ich habe aber immerhin meinen Post formatieren können  ;).

MadMax-FHEM

#227
Zitat von: Madstar2409 am 21 August 2019, 15:09:11
Danke für den Hinweis aber um ehrlich zu sein hilft mir das bei meinen Problem nicht weiter. Ich habe aber immerhin meinen Post formatieren können  ;).

Dann nicht aufmerksam genug gelesen ;)

Poste doch mal ein list eines dieser neuen MQTT-Dinger ;)

Steht in den INTERNALS tatsächlich unter TYPE MQTT2_DEVICE?

Ansonsten kannst du z.B. mal ein paar Logausgaben einbauen, damit man sieht was wie wo:

Ganz am Anfang, damit man sieht was überhaupt rein kommt.
Da du den Anfang weggelassen hast (also dort wo man die übergebenen Parameter sieht) habe ich mal "nur" $DEVICE loggen lassen...
...wenn mehr Parameter kommen, vielleicht auch die mal loggen lassen...

Log3(undef,3,"BatteryFunction    Device: $Device       BatteryType: $BatteryType[0]");


Und dann mal sehen, ob du generell "rein läufst" und was denn der Batteriewert so "spricht"...


elsif($BatteryType[0] eq "battery"  && InternalVal($Device, "TYPE", "undef") eq "MQTT2_DEVICE")
{
   if(ReadingsVal($Device, "battery", "na") eq "low")
   {
     $ActBatLevel = 0;
   }
   else
   {
    $ActBatLevel = ReadingsNum($Device, "battery", "0");
   }

Log3(undef,3,"BatteryFunction    ActBatLevel: $ActBatLevel");

   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");
     }


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)

Madstar2409

Hallo MadMax,

Hier mal ein Auszug von einem Gerät mit Internals und Readings.

Internals
CID zigbee_0x00158d000xxxxxx
DEF zigbee_0x00158d000xxxxxx

DEVICETOPIC eg_hwr_tuer
FUUID 5d5a5811-f33f-60b1-9d1d-0bb590bxxxxxxx
IODev MQTT2_Broker

LASTInputDev MQTT2_Broker

MQTT2_Broker_MSGCNT 70
MQTT2_Broker_TIME 2019-08-22 08:01:43
MSGCNT 70
NAME eg_hwr_tuer
NR 616
STATE close
TYPE MQTT2_DEVICE



Readings
associatedWith MQTT2_MQTT2Broker 2019-08-19 10:04:33
battery 100 2019-08-22 08:01:43
contact true 2019-08-22 08:01:43
linkquality 102 2019-08-22 08:01:43
voltage 3035 2019-08-22 08:01:43


Der TYPE ist MQTT2_DEVICE.

Ich habe nun den Part der Funktion abgeändert der für meine Geräte greifen sollte aber kein Erfolg.
Hier mal die gesamte Funktion.

#########################################################################
# 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 MessageBOT message ";
#
# 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");
    }
  }
  ##############################################
  # 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);
     }
   }
}

  ##############################################
  # HUE Devices
  ##############################################

elsif($BatteryType[0] eq "battery"  && InternalVal($Device, "TYPE", "undef") eq "HUEDevice")
{
   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);
      }
    }
  }
 
  ##############################################
  # XiaomiMQTTDevice Devices
  ##############################################
 
 
   elsif($BatteryType[0] eq "battery"  && InternalVal($Device, "TYPE", "undef") eq "XiaomiMQTTDevice")
{
   $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
      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);
      }
    }
  }

##############################################
  # MQTT2_DEVICE Devices
  ##############################################
elsif($BatteryType[0] eq "battery"  && InternalVal($Device, "TYPE", "undef") eq "MQTT2_DEVICE")
{
   $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
      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");
    }
  }
}

##################################################
# 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;
}

#####################################################
# Start script once and delet after

sub BatteryStart()
{
#Define Dummys for script
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
my $ReadingsGroup = "rgBatteryStatus"; #Name of the ReadingsGroup
my $Room = "Batterystatus"; #room for the dummys
my $Notify = "NO.BatterieNotify"; #Name of the Notify for sending battery information

fhem("setdefaultattr room $Room; define $BatteryStatus dummy; define $BatteryStatusBot dummy; define $BatteryChanged dummy;
      define $ReadingsGroup readingsGroup NAME=BatterieStatus:.*; attr $ReadingsGroup valueIcon {SetBatterieIcon(\$READING, \$VALUE)};
      attr $ReadingsGroup mapping \$READING; setdefaultattr;");


#Set Readings for device with reading battery
my @bat_b = devspec2array("battery=.*");
for(my $x=0;$x<@bat_b;$x++)
{
my $stat_b = ReadingsVal($bat_b[$x],"battery","undef");
if($stat_b ne "undef")
{
BatteryStatusFunction($bat_b[$x],"battery: $stat_b");
}
}

#Set Readings for device with reading batteryLevel
my @bat_l = devspec2array("batteryLevel=.*");
for(my $x=0;$x<@bat_l;$x++)
{
my $stat_l = ReadingsVal($bat_l[$x],"batteryLevel","undef");
if($stat_l ne "undef")
{
BatteryStatusFunction($bat_l[$x],"batteryLevel: $stat_l");
}
}

fhem("define $Notify notify .*:battery.* {BatteryStatusFunction(\$NAME, \$EVENT)}; attr $Notify room $Room;")
}





Log im Anhang. Also die Werte werden gelesen aber nicht richtig dargestellt. Liegt es evtl. an den Wert für Model. Der ist bei den Geräten wo es funktioniert undef und bei den MQTT Geräten irgendwas mit zigbee...?

MadMax-FHEM

#229
Warum hast du die Logausgaben nicht eingebaut?
EDIT: oder ist die weiter unten erwähnte von dir? Was steht denn dann dazu im Log? Ah, ok, Log als Bild. Hmmm, besser als "code" posten!

So kann man nur (was du ja schon getan hast) theoretisch checken, dass der Teil eigentlich gehen sollte/könnte/müsste...
...aber ohne weitere Infos WEISS man es halt nicht (warum nicht)...

D.h. es läuft für andere Geräte von dir!?

Wie geschrieben ich würde mal alles ausgeben lassen was "rein" kommt bzw. zu Beginn "erzuegt" wird...
...bin ja nicht mal sicher welche Version des Codes du nutzt (gibt da wohl mehrere!?).

Bzw. ein Log-Eintrag müsste doch kommen:


# 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


Was steht denn dazu im Log?
Also bzgl. Device, Event und Model?

EDIT: ok, als Bild...

Evtl. (wie geschrieben) mal erweitern um weitere Werte, wie z.B. Type etc.
EDIT: das wäre interessant. Model wird (soweit ich's im Kopf hab/überflogen hab) nur für HomeMatic verwendet...

Ich bin da ja (eigentlich) schon lang raus, hatte nur mal meinen Ursprungscode gepostet ;)

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)

Madstar2409

Ok ich bin nun sicher das es an Model liegt.  Ich habe von einem MQTT2_DEVICE Gerät das Attribut Model gelöscht und siehe das Gerät wird erkannt bzw. die richtigen Werte. Siehe folgende Logs und Screenshot.


2019.08.22 11:18:17 3: my_StoreBatteryStatus      Device: Temp_Sensor_Kueche       Event: battery: 91      Model: L_07_TempHumHpa_TempSensor      Type: MQTT2_DEVICE
2019.08.22 11:18:17 3: my_StoreBatteryStatus      Device: Temp_Sensor_SZ       Event: battery: 86      Model: L_07_TempHumHpa_TempSensor      Type: MQTT2_DEVICE
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: eg_flur_haustuer       Event: battery: 100      Model: L_06_zigbee2mqtt_ContactSensor      Type: MQTT2_DEVICE
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: eg_hwr_fenster       Event: battery: 100      Model: L_06_zigbee2mqtt_ContactSensor      Type: MQTT2_DEVICE
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: eg_hwr_tuer       Event: battery: 100      Model: L_06_zigbee2mqtt_ContactSensor      Type: MQTT2_DEVICE
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: eg_kueche_fenster       Event: battery: 86      Model: L_06_zigbee2mqtt_ContactSensor      Type: MQTT2_DEVICE
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: eg_wz_doppelfenst_li       Event: battery: 100      Model: undef      Type: MQTT2_DEVICE
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: eg_wz_doppelfenst_re       Event: battery: 100      Model: L_06_zigbee2mqtt_ContactSensor      Type: MQTT2_DEVICE
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: eg_wz_einzelfenster       Event: battery: 100      Model: L_06_zigbee2mqtt_ContactSensor      Type: MQTT2_DEVICE
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: eg_wz_terrasse_li       Event: battery: 100      Model: L_06_zigbee2mqtt_ContactSensor      Type: MQTT2_DEVICE
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: og.dachboden.lucke       Event: battery: ok      Model: undef      Type: MAX
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: Pflanzensensor1       Event: batteryLevel: 95      Model: undef      Type: XiaomiFlowerSens
2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: Pflanzensensor2       Event: batteryLevel: 100      Model: undef      Type: XiaomiFlowerSens


2019.08.22 11:18:18 3: my_StoreBatteryStatus      Device: eg_wz_doppelfenst_li       Event: battery: 100      Model: undef      Type: MQTT2_DEVICE

Nun ist die Frage wie bekomme ich das im Modul Code korrigiert.  ???

Hier nochmal der Code des Batterie Moduls.

#########################################################################
# 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 MessageBOT message ";
#
# msg-command
# my $msg = "msg \@User title='Battery Check' ";
#
# Pushover
# my $msg = "set Pushover msg device=User title='Battery Check' ";


  #Log3(undef,3,"my_StoreBatteryStatus    Device: $Device       BatteryType: $BatteryType[0]");
  Log3(undef, 3, "my_StoreBatteryStatus      Device: $Device       Event: $Event      Model: $Model      Type: $TYPE");
 
  # 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");
    }
  }
  ##############################################
  # 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);
     }
   }
}

  ##############################################
  # HUE Devices
  ##############################################

elsif($BatteryType[0] eq "battery"  && InternalVal($Device, "TYPE", "undef") eq "HUEDevice")
{
   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);
      }
    }
  }
 
  ##############################################
  # XiaomiMQTTDevice Devices
  ##############################################
 
 
   elsif($BatteryType[0] eq "battery"  && InternalVal($Device, "TYPE", "undef") eq "XiaomiMQTTDevice")
{
   $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
      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);
      }
    }
  }

##############################################
  # MQTT2_DEVICE Devices
  ##############################################
elsif($BatteryType[0] eq "battery"  && InternalVal($Device, "TYPE", "undef") eq "MQTT2_DEVICE")
{
   $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
      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");
    }
  }
}

##################################################
# 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;
}

#####################################################
# Start script once and delet after

sub BatteryStart()
{
#Define Dummys for script
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
my $ReadingsGroup = "rgBatteryStatus"; #Name of the ReadingsGroup
my $Room = "Batterystatus"; #room for the dummys
my $Notify = "NO.BatterieNotify"; #Name of the Notify for sending battery information

fhem("setdefaultattr room $Room; define $BatteryStatus dummy; define $BatteryStatusBot dummy; define $BatteryChanged dummy;
      define $ReadingsGroup readingsGroup NAME=BatterieStatus:.*; attr $ReadingsGroup valueIcon {SetBatterieIcon(\$READING, \$VALUE)};
      attr $ReadingsGroup mapping \$READING; setdefaultattr;");


#Set Readings for device with reading battery
my @bat_b = devspec2array("battery=.*");
for(my $x=0;$x<@bat_b;$x++)
{
my $stat_b = ReadingsVal($bat_b[$x],"battery","undef");
if($stat_b ne "undef")
{
BatteryStatusFunction($bat_b[$x],"battery: $stat_b");
}
}

#Set Readings for device with reading batteryLevel
my @bat_l = devspec2array("batteryLevel=.*");
for(my $x=0;$x<@bat_l;$x++)
{
my $stat_l = ReadingsVal($bat_l[$x],"batteryLevel","undef");
if($stat_l ne "undef")
{
BatteryStatusFunction($bat_l[$x],"batteryLevel: $stat_l");
}
}

fhem("define $Notify notify .*:battery.* {BatteryStatusFunction(\$NAME, \$EVENT)}; attr $Notify room $Room;")
}

Wzut

IMHO sollte man hier nachbessern :
if($BatteryType[0] eq "battery"  && $Model ne "HM-TC-IT-WM-W-EU" && $Model ne "HM-CC-RT-DN" && $Model ne "undef")
weil sonst die Dinger unter die HM Decke rutschen :)
D.h. wenn es HM sein soll warum dann nicht gleich auf TYPE CUL_HM prüfen ?
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

MadMax-FHEM

#232
Das dachte ich auch...
...weil Model ja sonst nirgends groß "vorkommt"...
...drum ja mal loggen lassen was rein kommt bzw. gleich zuu Beginn "definiert/erkannt" wird...

Damit lässt sich dann besser feststellen "wo es dann im Code lang geht" ;)

EDIT: diese Zeile ist (zugegebenermassen) auch sehr "speziell" ;) Die habe ich halt damals (bei mir) eingebaut, um die etwas "schlaueren" HM-Devices (die Spannungen liefern) auch zu bekommen. Sauberer wäre nat. ein genereller "Umbau" der Readings auf "Standard". Es gab/gibt ja eine Diskussion diesbezüglich... Oder halt das mal "echt gerade rücken" (wüsste nur nicht wie und da es für mich passt/gepasst hat ;)  ).

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)

Madstar2409

#233
Ok, ich habe den Part für die HM Devices nun entfernt(da ich sie nicht brauche) und es werden nun die Batteriestatus readings initial auf 100 (grün) gesetzt. Leider werden die Readings nicht aktualisiert mit den realen Geräte Readings wenn EVENTS zu den Geräten rein kommen. Ich suche noch warum sie nicht aktualisiert werden.
EDIT: Sorry hatte die Logik im Code falsch interpretiert. Es sollte alles funktionieren. Vielen Dank für eure Hilfe.  :) :) :) :)

MadMax-FHEM

Kommen Events?

EventMonitor und schauen...

Was zeigt dir, dass nicht aktualisiert wird, obwohl Events kommen?

Irgendwo event-on-change gesetzt?

Wie sieht das Notify aus, welches ja die Werte "berechnet"?
Triggert es (bei den Events)?

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)

Madstar2409

Hi MadMax,

habe meinen vorherigen parallel gerade editiert. Es ist alles ok. Ich hatte die Logik im Modul erst falsch gedeutet. Habe dann ein manuelles setreading gemacht und es funktioniert wie es soll ;-).

VG

MadMax-FHEM

Kein Ding!

Wenn es geht is gut! :)

Viel Spaß, 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)

FunkOdyssey

Ich nutze neuerdings diese Lösung hier und auch den Zweig 'no-BatteryStatusBot'.
Bei meinen Z-Wave-Geräten erhalte ich die Benachrichtungen doppelt und weiß nicht wieso.

Als Event habe ich Folgendes:

2019-10-31_06:52:12 zw_pir battery: 20 %
2019-10-31_06:52:12 zw_pir batteryPercent: 20


Im FHEM-Log das hier:

2019.10.31 06:52:12.065 1:  PERL WARNING: Use of uninitialized value $v in substitution (s///) at fhem.pl line 1131.
2019.10.31 06:52:12.065 3:  eval: my $EVTPART1='20';my $NAME='zw_pir';my $EVENT='battery: 20 %';my $TYPE='ZWave';my $SELF='NO.BatterieNotify';my $EVTPART0='battery:';my $EVTPART2='%';{BatteryStatusFunction($NAME, $EVENT)}
2019.10.31 06:52:12.065 1:  PERL WARNING: Use of uninitialized value $v in concatenation (.) or string at fhem.pl line 1132.
2019.10.31 06:52:12.065 3:  eval: my $EVTPART1='20';my $NAME='zw_pir';my $EVENT='battery: 20 %';my $TYPE='ZWave';my $SELF='NO.BatterieNotify';my $EVTPART0='battery:';my $EVTPART2='%';{BatteryStatusFunction($NAME, $EVENT)}


Das Gerät hat diese Readings:

     2019-10-31 06:52:12   battery         20 %
     2019-10-31 06:52:12   batteryPercent  20
     2019-10-31 06:52:12   batteryState    ok



Hat jemand eine Idee woran der Doppelversand liegt?

DeeSPe

Zitat von: FunkOdyssey am 31 Oktober 2019, 09:29:12
Hat jemand eine Idee woran der Doppelversand liegt?

Ja, es liegt daran dass das notify auf battery, batteryLevel und batteryPercent reagiert.
Ändere doch einfach den Trigger des notify:
define NO.BatterieNotify notify .*:(battery|batteryLevel)\s.* {BatteryStatusFunction($NAME, $EVENT)}

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

FunkOdyssey

Danke für den Tipp.
Ich habe mich rückwärts durch den Code gearbeitet und bin auch gerade an dieser Stelle stehengeblieben. Ich hätte vielleicht dem Event folgen sollen. :-)
Aber auf deine Schreibvariante wäre ich nicht gekommen. Das \s hätte ich vergessen. Danke. Ich probiere es aus.