[erledigt] valuestyle und valueformat _ verständnisproblem

Begonnen von the ratman, 02 August 2017, 17:31:23

Vorheriges Thema - Nächstes Thema

supernova1963

#15
Vorschlag Zusammenfassung:

valueStyle verwendet nicht das Ergebnis des return - Wertes von valueFormat!

Wenn man alles in der readingsGroup abbildet werden soll, muss man im valueFormat Attribut auch die gewünschten styles programmieren, da valueStyle die notwendigen Perl Befehle nicht untzerstützt. 

Die Lösung des geschilderten Problems ist für den Fragesteller nebensächlich!
Hierfür existieren, wie in den Beiträgen geschildert, verschiedene Umgehungslösungen.

Danke an Alle für ihre Beiträge ...

MadMax-FHEM

#16
Hier mal mein abgestrippter Code (daher ohen Funktionsgarantie ;)  ):

$myDummyBatteryStates ist eine Variable hinter der sich der DummyName verbirgt, kann also auch direkt hardcoded durch den gewählten Namen ersetzt werden.


#########################################################################
# 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 my_StoreBatteryStatus($$)
{
  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 $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

#  Log(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")
  {
    Log(1,"my_StoreBatteryStatus      ignoring Device: $Device");
    return;
  }

  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")
    {
      {fhem "setreading $myDummyBatteryStates $Device 100"}
    }
    else
    {
      {fhem "setreading $myDummyBatteryStates $Device 0"}
    }
  }
  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))
    {
      {fhem "setreading $myDummyBatteryStates $Device 100"} # between 75% and 100%
    }
    elsif(($ActBatLevel - $MinBatLevel) > (2 * $RemainingVoltageQuater))
    {
      {fhem "setreading $myDummyBatteryStates $Device 75"} # between 50% and 75%
    }
    elsif(($ActBatLevel - $MinBatLevel) > (1 * $RemainingVoltageQuater))
    {
      {fhem "setreading $myDummyBatteryStates $Device 50"} # between 25% and 50%
    }
    elsif(($ActBatLevel - $MinBatLevel) > (0 * $RemainingVoltageQuater))
    {
      {fhem "setreading $myDummyBatteryStates $Device 25"} # between 0% and 25%
    }
    else
    {
      {fhem "setreading $myDummyBatteryStates $Device 0"} # totally empty
    }
  }
  elsif($BatteryType[0] eq "battery"  && InternalVal($Device, "TYPE", "undef") eq "ZWave")
  {
    $ActBatLevel = ReadingsNum($Device, "battery", "0");

    if($ActBatLevel > 75)
    {
      {fhem "setreading $myDummyBatteryStates $Device 100"} # above 75%
    }
    elsif($ActBatLevel > 50)
    {
      {fhem "setreading $myDummyBatteryStates $Device 75"} # between 50% and 75%
    }
    elsif($ActBatLevel > 25)
    {
      {fhem "setreading $myDummyBatteryStates $Device 50"} # between 25% and 50%
    }
    elsif($ActBatLevel > 5)
    {
      {fhem "setreading $myDummyBatteryStates $Device 25"} # between 5% and 25%
    }
    else
    {
      {fhem "setreading $myDummyBatteryStates $Device 0"} # totally empty (below 5%)
    }
  }
  elsif($BatteryType[0] eq "batteryLevel"  && InternalVal($Device, "TYPE", "undef") eq "XiaomiFlowerSens")
  {
    $ActBatLevel = ReadingsNum($Device, "batteryLevel", "0");

    if($ActBatLevel > 75)
    {
  # set the battery value to 100%
      {fhem "setreading $myDummyBatteryStates $Device 100"} # above 75%
    }
    elsif($ActBatLevel > 50)
    {
      {fhem "setreading $myDummyBatteryStates $Device 75"} # between 50% and 75%
    }
    elsif($ActBatLevel > 25)
    {
      {fhem "setreading $myDummyBatteryStates $Device 50"} # between 25% and 50%
    }
    elsif($ActBatLevel > 5)
    {
      {fhem "setreading $myDummyBatteryStates $Device 25"} # between 5% and 25%
    }
    else
    {
      {fhem "setreading $myDummyBatteryStates $Device 0"} # totally empty (below 5%)
    }
  }
}



Bei bestimmten Werten (leer) schicke ich dann noch Nachrichten und wenn zuvor leer und dann wieder voll schreibe ich in einen weiteren Dummy ebenfalls einen Eintrag, so sehe ich wann die Batterie gewechselt wurde...

Und es ist noch viel mehr möglich...

Das setzen auf die Werte 0, 25, 50, 75, 100 mache ich wegen der Icons in meiner readingsGroup, das brauchst du wohl nicht...


Und hier der Notify:


Internals:
   DEF        .*:battery.* {my_StoreBatteryStatus($NAME, $EVENT)}
   NAME       SetBatteryStatus
   NR         147
   NTFY_ORDER 50-SetBatteryStatus
   REGEXP     .*:battery.*
   STATE      2017-08-13 12:41:05
   TYPE       notify
   READINGS:
     2017-08-05 19:18:46   state           active
Attributes:


und der Dummy:


Internals:
   CHANGED
   NAME       BatteryStates
   NR         148
   STATE      ???
   TYPE       dummy
   READINGS:
     2017-08-13 09:09:58   Auge_Schrank1   100
     2017-08-12 20:09:21   Auge_Schrank2   100
     2016-04-02 23:22:23   Fenster_Bad     100
     2016-10-15 20:43:39   Fenster_Essi    100
     2016-04-02 23:44:18   Fenster_SchlaZi 100
     2016-03-19 20:34:47   Fenster_ZiVier  100
     2017-08-13 12:40:01   Heizkoerperthermostat_Bad 75
     2017-08-13 12:38:56   Heizkoerperthermostat_Esszi 25
     2017-08-13 12:39:31   Heizkoerperthermostat_Kueche 75
     2017-08-13 12:38:44   Heizkoerperthermostat_SchlaZi 50
     2017-08-13 12:38:13   Heizkoerperthermostat_WoZi 75
     2017-08-13 12:40:07   Heizkoerperthermostat_ZiVier1 75
     2017-08-13 12:39:56   Heizkoerperthermostat_ZiVier2 75
     2017-08-13 11:46:14   Rauchmelder_EssZi 100
     2017-05-06 19:45:20   Schalter_Schrank1 100
     2017-05-06 19:46:11   Schalter_Schrank2 100
     2017-08-13 11:21:21   Wandthermostat_Esszi 75
     2017-08-13 11:11:30   Wandthermostat_Kueche 75
     2017-08-13 11:57:58   Wandthermostat_WoZi 75
Attributes:
   event-on-change-reading .*


Wenn die Namen der Readings nicht gefallen, kann das natürlich in der Funktion angepasst werden, beispielsweise den alias abfragen etc.

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)