Syntax bzw Logikfrage für Frostschutz / Zustand off am Thermostat HM-CC-RT-DN

Begonnen von Jorche, 20 Februar 2015, 02:32:25

Vorheriges Thema - Nächstes Thema

Jorche

Hallo zusammen,

ich versuche gerade den Kinderschuhen zu entwachsen und spiele etwas mit den Vorschlägen aus dem Wiki, momentan an der Heizungssteuerung http://www.fhemwiki.de/wiki/ReadingsGroup#Heizungsteuerung_f.C3.BCr_HM_Wand-_und_Heizk.C3.B6rperthermostate

Hierbei erweitere ich die verfügbaren Werte für die Temperatur um den Zustand on oder off bzw. Frostschutz, was auch funktioniert :)
attr heatinginfo commands {'heatingInfo.sollsetz'=>'desired-temp:on,off,5.0,12.0,14.0,15.0,16.0,18.0,19.0,20.0,20.5,21.0,21.5,22.0,23.0,24.0',
"controlMode.manual"=>"set %DEVICE controlMode auto","controlMode.auto"=>"set %DEVICE controlMode manual",
"R-globalBtnLock.on"=>"set %DEVICE regSet globalBtnLock off", "R-globalBtnLock.off"=>"set %DEVICE regSet globalBtnLock on"}


Dies führt bei der Berechnung der Farbwerte für die Temperatruranzeige mittels
attr heatingInfo valueStyle {if($READING eq "measured-temp")
{my $t=$VALUE;;my $d=ReadingsVal($DEVICE,'desired-temp',0);;
if($t-$d>=1){'style="color:rgb(251,63,11);;"'}elsif($t-$d<=-1){'style="color:rgb(79,58,251);;"'}
else{'style="color:rgb(12,251,12);;"'}}}


aber zum berechtigten Fehler in der Log alle 18s, da der Rückgabewert "off" natürlich keine Zahl ist
"PERL WARNING: Argument "off" isn't numeric in subtraction (-) at (eval xyz) line 1"

Meine Idee war nun, den Wert 'off' im String abzufangen und durch 0°C für den Frostschutz zu ersetzen. Doch leider scheitere ich am Syntax bzw. dem richtigen Perl-Trick  :-[

Am besten hat statt

attr heatingInfo valueStyle {if($READING eq "measured-temp")
{my $t=$VALUE;;my $d=ReadingsVal($DEVICE,'desired-temp',0);;
if($t-$d>=1){'style="color:rgb(251,63,11);;"'}elsif($t-$d<=-1){'style="color:rgb(79,58,251);;"'}
else{'style="color:rgb(12,251,12);;"'}}}


bisher funktioniert:

attr heatingInfo valueStyle {if($READING eq "measured-temp")
{my $t=$VALUE;;my $d=ReadingsVal($DEVICE,'desired-temp',0);;if($d=='off'){$d==0};;
if($t-$d>=1){'style="color:rgb(251,63,11);;"'}elsif($t-$d<=-1){'style="color:rgb(79,58,251);;"'}
else{'style="color:rgb(12,251,12);;"'}}}


Dabei bleibt die Funktionalität erhalten, doch scheint es weiter Probs zu geben
"PERL WARNING: Useless use of numeric eq (==) in void context at (eval 67821) line 1"

Leider konnte ich bisher keinen Tipp oder ein Beispiel finden, wie und an welcher Stelle die Variablen Änderung durchgeführt werden muss, sodass es nicht zu einem Fehlereintrag kommt.

Da der Fall eines Alphanumerischen-Strings doch öfters vorkommt, gibt es hoffentlich eine simple Lösung, die einem Newbiez Post gerecht ist ;)

In jedem Fall vielen Dank für eure Mühen
Jorche

PS: Das gleiche Prob setzt sich natürlich auch im valueSuffix fort, "off°C" sieht nicht soo schön aus ;)

Jorche

Update und kleiner Push nach vorn:

1) Fehlerangabe in der Logdatei
Das (Syntax)-Problem mit valueStyle habe ich übers WE in den Griff bekommen und etwa 11MB aus der Logdatei gelöscht :) Die richtige Antwortet lautet:
attr heatingInfo valueStyle {if($READING eq "measured-temp")
{my $t=$VALUE;;my $d=ReadingsVal($DEVICE,'desired-temp',0);;if($d eq 'off'){$d=0};;
if($t-$d>=1){'style="color:rgb(251,63,11);;"'}elsif($t-$d<=-1){'style="color:rgb(79,58,251);;"'} else{'style="color:rgb(12,251,12);;"'}}}


D.h. falls der Wert $d ein String ist, muss "eq" statt "==" als Vergleichsoperator genutzt werden. Ebenso zum Setzen des Ersatzwerts 0 lediglich "="

2)Problem bei valueSuffix
Hier habe ich für die Einheiten nach der Zahl einen ähnlichen Vergleich gestartet
attr heatingInfo valueSuffix {if($READING eq "desired-temp"){my $d=ReadingsVal($DEVICE,'desired-temp',0);;if($d ne 'off'){" °C"}else{""}}}

Dieser funktioniert wie er soll, solange nur die Einheit der Soll-Temperatur manipuliert wird.

Sobald aber ein weiterer Wert mit
attr heatingInfo valueSuffix {if($READING eq "desired-temp"){my $d=ReadingsVal($DEVICE,'desired-temp',0);;if($d ne 'off'){" °C"}else{""}};;"measured-temp"=>" °C","ValvePosition"=>" (".ReadingsVal($DEVICE,$READING,0)." %)}" gesetzt wird, bekommen ALLE Werte die letzte angegebene Einheit zugewiesen, in diesem Fall "%" und die Logdatei explodiert
Zitat2015.02.23 16:57:06 1: PERL WARNING: Useless use of a constant ( °C) in void context at (eval 26163) line 1.
2015.02.23 16:57:06 1: PERL WARNING: Useless use of a constant () in void context at (eval 26163) line 1.
2015.02.23 16:57:06 1: PERL WARNING: Useless use of a constant (measured-temp) in void context at (eval 26163) line 1.
2015.02.23 16:57:06 1: PERL WARNING: Useless use of a constant (ValvePosition) in void context at (eval 26163) line 1.

Meine Schlussfolgerung ist momentan, dass der Vergleich am Anfang innerhalb von valueSuffix alle weiteren Einheitenbefehle blockiert bzw. valueSuffix für meinen Plan nicht geeignet ist.
Wenn jemand einen (Denk-)Fehler findet, bin ich sehr dankbar. Natürlich auch für Vorschläge zur Lösung ^^

Grüße
Jorche

Omega

Hi,
ich vermute mal, dass du inzwischen eine Lösung gefunden hast.
Ich habe mir auch gerade die readinggroup eingerichtet und bin mit folgendem zur Lösung gekommen (wobei ich auch den Staus "on" berücksichtige):


attr heatingInfo valueSuffix {
'desired-temp' => '{ return "" if( $VALUE eq "off");;return "" if( $VALUE eq "on");; return " °C";;}',
'measured-temp'=>' °C',
'ValvePosition'=>" (".ReadingsVal($DEVICE,$READING,0)." %)",
'humidity'=>" ".ReadingsVal($DEVICE,$READING,0)." % RH",
'batteryLevel'=>" (".ReadingsVal($DEVICE,$READING,0)." V)"}


Gruß
Holger
NUC6i3SYH (FHEM 5.8 in VM)
Homematic: HMLAN, HMUSB, HM-Sec-SD, HM-CC-RT-DN, HM-TC-IT, ... + diverse weitere
LaCrosseGateway, ESPEasy
ZWave