ReadingsGroup - Fehlermeldung & Nicht übernahme der Werte

Begonnen von OK_DE, 20 Oktober 2014, 23:02:33

Vorheriges Thema - Nächstes Thema

OK_DE

Hallo,

ich habe gestern versucht mir nach dem Wiki http://www.fhemwiki.de/wiki/ReadingsGroup eine ReadingsGroup für meine Homematic Heizungs Thermostate anzulegen.
Eine Umschaltung zwischen Auto und Manual Mode ist zusätzlich von mir implementiert worden (Klick auf Angezeigten Wert Toggelt auf den anderen Wert), hier liegt scheinbar auch das größte Problem.

Die Anzeige der Werte und die Funktion der Webseite funktioniert 1A.
(http://i61.tinypic.com/30dcnxv.png)





Vier Probleme.
1. Großes Problem: Es hagelt Fehlermeldungen im Logfile.
Heizungswerte: <{myUtils_HeizungMode($DEVICE,controlMode)}@controlMode>: Bareword "controlMode" not allowed while "strict subs" in use at (eval 61592) line 1.

2. BIG Problem: Die neuen Einstellungen werden nicht an Thermostate gesendet sondern nach ein paar Minuten über die Rückmeldung des Thermstats wieder auf den alten Wert zurückgesetzt. (Kann das am von mir verwendeten Homematic LAN Adapter liegen ?)

3. Schönheitsfehler: Filtert man nach _Clima, wird neben dem Kanal _Clima auch _Climate und _ClimaTeam angezeigt ich habe mir jetzt mit zwei unterstrichen beholfen. Schön ist das aber nicht. Gibt es hier eine Möglichkeit das auf _Clima ohne Zusatz zu beschränken.
define Heizungswerte readingsGroup <%sani_heating>,<Soll>,<Ist>,<Up>,<Desired>,<Down>,<MaxV>,<Mode> *__Clima.*

4. Schönheitsfehler: Der Code aus dem Wiki um 00 Werte invisible zu setzen funkioniert bei mir nicht. Der Wert ist immer sichtbar.
attr Heizungswerte valueStyle {($VALUE eq "00")?'style="visibility:hidden"':}


Danke für eure Hilfe im Voraus.




Auszug aus fhem.cfg
#---------Start:readingsGroup_Heizung---------
define Heizungswerte readingsGroup <%sani_heating>,<Soll>,<Ist>,<Up>,<Desired>,<Down>,<MaxV>,<Mode> *__Clima.*:desired-temp,measured-temp,<{myUtils_HeizungUpDown($DEVICE,"up")}@desired-new>,desired-new,<{myUtils_HeizungUpDown($DEVICE,"down")}@desired-new>,R-valveMaxPos,controlMode,<{myUtils_HeizungMode($DEVICE,controlMode)}@controlMode>
attr Heizungswerte commands { 'controlMode.auto' => 'setreading $DEVICE controlMode manual', 'controlMode.manual' => 'setreading $DEVICE controlMode auto' }
attr Heizungswerte mapping $DEVICE
attr Heizungswerte nameStyle style="color:yellow"
attr Heizungswerte room Heizung
attr Heizungswerte valueFormat {'desired-temp' => "%.1f °C", 'measured-temp' => "%.1f °C"}
attr Heizungswerte valueStyle style="text-align:center"
#---------Ende:readingsGroup_Heizung---------


Auszug aus 99_Utils.pm
sub
myUtils_HeizungUpDown($$)
{
  my($DEVICE,$CMD) = @_;

  my $link;
  my $icon = $CMD;
  my $VALUE = ReadingsVal($DEVICE,"desired-new","00");
  $VALUE = ReadingsVal($DEVICE,"desired-temp","20" )
     if( !$VALUE || $VALUE == 0 );

if( $CMD eq "up" )
{
$icon = "control_arrow_upward";
if( $VALUE < 30 ) { $VALUE += 1; }
}
elsif( $CMD eq "down" )
{
$icon = "control_arrow_downward";
if( $VALUE > 5 ) { $VALUE -= 1; }
}

if( $VALUE <= 17 )
{
  $icon .= "\@blue";
}
elsif( $VALUE > 17 && $VALUE < 23 )
{
  $icon .= "\@green";
}
elsif( $VALUE >= 23 )
{
  $icon .= "\@red";


  $link = "setreading $DEVICE desired-new $VALUE";
 
  my $notify = "notifyHeizungUpDown";
  if( !defined($defs{$notify}) )
  {
CommandDefine(undef, "$notify notify .*:desired-new.* "."{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }" );
  }

  my $ret = "%$icon";
  $ret .= "%$link" if( $link );

  return $ret;
}

sub
myUtils_HeizungUpDownNotify($$)
{
  my($DEVICE,$VALUE) = @_;

  return if( $VALUE == 0 );

  my $at = "triggerHeizungUpDown_$DEVICE";
  CommandDelete(undef, $at) if( defined($defs{$at}) );
  CommandDefine(undef,
                 "$at at +00:00:10 "
                 ."{my \$v = ReadingsVal(\"$DEVICE\",\"desired-new\",undef);"
                 ."fhem(\"setreading $DEVICE desired-temp \$v\") if( \$v );"
                 ."fhem(\"setreading $DEVICE desired-new 00\");}" );

  return undef;
}


sub
myUtils_HeizungMode($$)
{
  my($DEVICE,$CMD) = @_;
  if( $CMD eq "auto" )
  {
     $CMD = "manual"
  }
  elsif( $CMD eq "manual" )
  {
     $CMD = "auto"
  }
  return "setreading $DEVICE controlMode $CMD";
}


justme1968

#1
1. controlMode im aufruf von myUtils_HeizungMode ist falsch. wenn du möchtest das der aktuelle wert übergeben wird muss da $VALUE stehen.

wenn du aber nur den mode toggeln willst brauchst du den ganzen myUtils_HeizungMode aufruf am ende nicht. er macht sowieso nicht das was du willst weil du hier zurück geben müsstest was angezeigt werden soll. nicht was ausgeführt werden soll. controlMode in der readings liste und das commands attribut alleine sollten schon genau das machen was was du willst. du musst nur set und nicht setreading aufrufen.

2. s.o. setreading setz nur den als reading angezeigten wert. wenn du ein kommando ausführen willst musst du set verwenden.

3. dein regulärer ausdruck *__Clima.* ist ersten falsch (ein * am anfang macht keinen sinn, wenn ich mich richtig erinnere gehört da nur ein _ rein und keine 2) und zweitens gibst du doch mit dem .* am ende an das alles mit Clima und irgendetwas danach matchen soll. wenn du nur die devices möchtest du mit _Clima aufhören sollte es so sein .*_Clima$

4. hängt eventuell vom browser ab kann aber auch ein folgefeiler sein. was sagt die javascript konsole?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

optimizer

zu 4: Das Verstecken der "00" hat bei mir mit Firefox 34 so auch nicht funktioniert. Ich konnte das aber so lösen:

{if($VALUE eq "00") {'style="visibility:hidden"'}}


Wie funktioniert deine Lösung mit dem Modusschalter?

KarlHeinz2000

Hallo,

ich bastel auch an dem rg Beispiel.
Beim Klicken auf die Pfeile ändert sich die desired-new immer nur um 1°C, egal wie oft ich klicke. Erst nachdem desired-temp aktualisiert wurde, kann ich die Temp wieder um 1°C ändern.
Soll das sos ein? Ich würde erwarten, dass sich die desired-new mit den Pfeilen >+/-1°C justieren lässt und nach Ablauf der Zeit die desired-temp aktualisiert wird.

KarlHeinz2000

Lösung:

@desired-temp durch @desired-new ersetzt

alt:

<{myUtils_HeizungUpDown($DEVICE,"up")}@desired-temp>,desired-new,<{myUtils_HeizungUpDown($DEVICE,"down")}@desired-temp>


neu:

<{myUtils_HeizungUpDown($DEVICE,"up")}@desired-new>,desired-new,<{myUtils_HeizungUpDown($DEVICE,"down")}@desired-new>


Jetzt ist die Funktion wie ich sie mir vorgestellt habe.

OK_DE

Hier die funktionierende Lösung. Falls es jemand benötigt.

Datei: fhem.cfg

#---------Start:readingsGroup_Heizung---------
define Heizungswerte readingsGroup <%sani_heating>,<Soll>,<Ist>,<Up>,<Desired>,<Down>,<Mode>  .*_Clima:desired-temp,measured-temp,<{myUtils_HeizungUpDown($DEVICE,"up")}@desired-new>,desired-new,<{myUtils_HeizungUpDown($DEVICE,"down")}@desired-new>,controlMode
attr Heizungswerte commands { 'controlMode.auto' => 'set $DEVICE controlMode manual', 'controlMode.manual' => 'set $DEVICE controlMode auto' }
attr Heizungswerte group Heizung
attr Heizungswerte mapping $DEVICE
attr Heizungswerte nameStyle style="color:yellow"
attr Heizungswerte noheading 1
attr Heizungswerte room Heizung
attr Heizungswerte style style="border:0px;;background:none;;box-shadow:none;;"
attr Heizungswerte valueFormat {'desired-temp' => "%.1f °C", 'measured-temp' => "%.1f °C"}
attr Heizungswerte valueStyle style="text-align:center"
define notifyHeizungUpDown notify .*:desired-new.* { myUtils_HeizungUpDownNotify($NAME,$EVTPART1);; }
#---------Ende:readingsGroup_Heizung---------



Datei: 99_myUtils.pm

sub
myUtils_HeizungUpDown($$)
{
  my($DEVICE,$CMD) = @_;

  my $link;
  my $icon = $CMD;
  my $VALUE = ReadingsVal($DEVICE,"desired-new","00");
  $VALUE = ReadingsVal($DEVICE,"desired-temp","20" )
     if( !$VALUE || $VALUE == 0 );

if( $CMD eq "up" )
{
$icon = "control_arrow_upward";
if( $VALUE < 30 ) { $VALUE += 1; }
}
elsif( $CMD eq "down" )
{
$icon = "control_arrow_downward";
if( $VALUE > 5 ) { $VALUE -= 1; }
}

if( $VALUE <= 17 )
{
  $icon .= "\@blue";
}
elsif( $VALUE > 17 && $VALUE < 23 )
{
  $icon .= "\@green";
}
elsif( $VALUE >= 23 )
{
  $icon .= "\@red";


  $link = "setreading $DEVICE desired-new $VALUE";
 
  my $notify = "notifyHeizungUpDown";
  if( !defined($defs{$notify}) )
  {
CommandDefine(undef, "$notify notify .*:desired-new.* "."{ myUtils_HeizungUpDownNotify(\$NAME,\$EVTPART1); }" );
  }

  my $ret = "%$icon";
  $ret .= "%$link" if( $link );

  return $ret;
}

sub
myUtils_HeizungUpDownNotify($$)
{
  my($DEVICE,$VALUE) = @_;

  return if( $VALUE == 0 );

  my $at = "triggerHeizungUpDown_$DEVICE";
  CommandDelete(undef, $at) if( defined($defs{$at}) );
  CommandDefine(undef,
                 "$at at +00:00:10 "
                 ."{my \$v = ReadingsVal(\"$DEVICE\",\"desired-new\",undef);"
                 ."fhem(\"setreading $DEVICE desired-temp \$v\") if( \$v );"
                 ."fhem(\"set $DEVICE desired-temp \$v\") if( \$v );"
                 ."fhem(\"setreading $DEVICE desired-new 00\");}" );

  return undef;
}