Funktion in myutils erkennt Zahl nicht

Begonnen von devil77, 29 März 2017, 14:43:09

Vorheriges Thema - Nächstes Thema

devil77

Hallo, ich habe folgende Funktion in meiner 99_myUtils.pm stehen.
my $aufheizen;
sub
aufheizen($)
{
# aufgerufene Parameter
my ($DEVICE) = @_;

my $temperatur = ReadingsVal($DEVICE,"Zieltemperatur","" );
my $stunden = ReadingsVal($DEVICE,"onfortimer","" );

# hole die aktuelle Zeit und Datum
my($sec1,$min1,$hour1,$day1,$mon1,$year1,$wday1,$yday1,$isdst1) = localtime(time);

# in UnixTime umwandeln
my $unixstarttime = mktime (localtime(time));
     
# Unix Endzeit berechnen 
my $unixendtime = $unixstarttime + (3600 * $stunden)+900;

# Unix Endzeit in "lesbare Zeit" umwandeln   
my ($sec2,$min2,$hour2,$day2,$mon2,$year2,$wday2,$yday2,$isdst2) = localtime($unixendtime);
   
# Setzte Variablen für Start- und Endpunkt
my $startTime = sprintf("%02d:%02d",$hour1,$min1);
my $endTime = sprintf("%02d:%02d",$hour2,$min2);
my $startDate = sprintf("%02d.%02d.%02d",$day1,$mon1 + 1,$year1 % 100);   
my $endDate = sprintf("%02d.%02d.%02d",$day2,$mon2 + 1,$year2 % 100);   
   
# HM-CC-RT-DN akzeptiert nur Minute auf 00 oder 30 enden, daher $startTime abrunden und $endTime aurfunden
$startTime =~ s/\:[0-2].$/:00/;
$startTime =~ s/\:[3-5].$/:30/;
$endTime =~ s/\:[0-2].$/:00/;
$endTime =~ s/\:[3-5].$/:30/;   
     
# Sendebefehl für HM-CC-RT-DN
   { fhem ("set $DEVICE controlParty $temperatur $startDate $startTime $endDate $endTime")};
   { fhem ("define aufheizenTemp at $endTime {Heating_Control_SetAllTemps()}")};
}
1;


Damit möchte ich ein Thermostat für eine bestimmte Zeit in den Partymodus versetzen. Der Dummy der diese Funktion aufruft hat 2 userattr onfortimer und Zieltemperatur.
Die Werte dafür kommen aus FTUI und können dort ausgewählt werden.
In der Routine selber soll über folgenden Code diese Werte ausgelesen werden.
my $temperatur = ReadingsVal($DEVICE,"Zieltemperatur","" );
my $stunden = ReadingsVal($DEVICE,"onfortimer","" );


Für die Zeit funktioniert das aber er erkennt die die Zieltemperatur scheinbar nicht als Zahl und damit funktioniert der Aufruf des Partymoduses nicht.
Bin etwas ratlos wo ich einen Fehler gemacht habe und hoffe jemand hat einen Tip für mich.

nils_

bekommst du eine fehlermeldung?
oder steht irgendwas im log??
viele Wege in FHEM es gibt!

Thorsten Pferdekaemper

...und dann noch ein list von dem Device (Dummy), das die Probleme hat.
Gruß,
   Thorsten
FUIP

devil77

Hier das list vom dummy


Internals:
   CFGFN
   COMMAND    {aufheizen("BA.o.Hz_Stellantrieb_Clima")}

   DEF        *15:01 {aufheizen("BA.o.Hz_Stellantrieb_Clima")}

   NAME       BA.o.HZ_aufheizen
   NR         251
   PERIODIC   yes
   RELATIVE   no
   REP        -1
   STATE      Next: 15:01:00
   TIMESPEC   15:01
   TRIGGERTIME 1490878860
   TRIGGERTIME_FMT 2017-03-30 15:01:00
   TYPE       at
   Readings:
     2017-03-29 13:53:44   Zieltemperatur  23
     2017-03-29 13:53:51   onfortimer      01:00
     2017-03-29 15:01:00   state           Next: 15:01:00
Attributes:
   room       Bad
   userattr   onfortimer Zieltemperatur


und als Fehlermledung steht folgende Zeile im log
set BA.o.Hz_Stellantrieb_Clima controlParty  29.03.17 15:00 29.03.17 15:00 : controlParty requires parameter: -temp- -startDate- -startTime- -enddate- -endTime-

Thorsten Pferdekaemper

Hi,
Du verwendest $DEVICE sowohl für den Namen des at (das ist ein at, kein Dummy), als auch für den Namen des Thermostats. Ich vermute, dass Du Deine Funktion mit dem Namen des Thermostats aufrufst, aber der hat halt kein Reading "Zieltemperatur".
Außerdem: Lass das Attribut userattr weg. Das verwirrt nur, da das at dadurch zwei Attribute bekommt, die genauso heißen wie Deine zwei Readings.
Gruß,
   Thorsten
FUIP

DeeSPe

Mit sprintf formatierte Zahlen müssen nach dem Formatieren wieder zu Zahlen gemacht werden, da sie durch sprintf zu Strings werden.
Das geht entweder mit:
sprintf(blabla) * 1;
Oder mit:
sprintf(blabla) + 0;

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

Thorsten Pferdekaemper

Zitat von: DeeSPe am 29 März 2017, 15:11:30
Mit sprintf formatierte Zahlen müssen nach dem Formatieren wieder zu Zahlen gemacht werden, da sie durch sprintf zu Strings werden.
In Perl? Seit wann?
Gruß,
   Thorsten
FUIP

nils_

#7
Zitat von: DeeSPe am 29 März 2017, 15:11:30
Mit sprintf formatierte Zahlen müssen nach dem Formatieren wieder zu Zahlen gemacht werden, da sie durch sprintf zu Strings werden.
Das geht entweder mit:
sprintf(blabla) * 1;
Oder mit:
sprintf(blabla) + 0;

Gruß
Dan

ich vermute da liegt nicht sein problem.

siehe:
set BA.o.Hz_Stellantrieb_Clima controlParty  29.03.17 15:00 29.03.17 15:00

müsste sein
set BA.o.Hz_Stellantrieb_Clima controlParty [b]TEMP[/b] 29.03.17 15:00 29.03.17 15:00

das
my $temperatur = ReadingsVal($DEVICE,"Zieltemperatur","" );
schlägt fehl und damit steht "" in seiner Variable, und damit passt sein set-Befehlt nicht mehr:


grundsätzlich hast du dich vermutlich an https://forum.fhem.de/index.php/topic,28163.0.html orientiert, oder? (hast du die umsetzung ausprobiert? )
zu den Besonderheiten Readings, Attribute, usw. kenn ich mich nicht genug aus, da muss dir jemand anderes weiterhelfen.
viele Wege in FHEM es gibt!

DeeSPe

Zitat von: Thorsten Pferdekaemper am 29 März 2017, 15:12:54
In Perl? Seit wann?
Gruß,
   Thorsten

Seit wann kann ich Dir nicht sagen.
Ich programmiere erst ca. ein 3/4 Jahr in Perl.
Das sind nur die Erfahrungen die ich in meinem Hyperion Modul gemacht habe. Andre hatte mich darauf hingewiesen dass sprintf aus Zahlen einen String macht.

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

Thorsten Pferdekaemper

Zitat von: DeeSPe am 29 März 2017, 15:25:00Das sind nur die Erfahrungen die ich in meinem Hyperion Modul gemacht habe. Andre hatte mich darauf hingewiesen dass sprintf aus Zahlen einen String macht.
Da würde mich jetzt echt mal interessieren, in welchem Kontext das Probleme bereitet.
Siehe auch:
http://perldoc.perl.org/perlnumber.html
Gruß,
   Thorsten
FUIP

DeeSPe

Zitat von: Thorsten Pferdekaemper am 29 März 2017, 15:29:36
Da würde mich jetzt echt mal interessieren, in welchem Kontext das Probleme bereitet.
Siehe auch:
http://perldoc.perl.org/perlnumber.html
Gruß,
   Thorsten

Okay, ich habe da glaube was verwechselt und nehme (fast) alles zurück... 8)
Ich hatte das Problem beim Erstellen von JSON.
Aus sprintf("%1f",Zahl) wurde immer '"Zahl": "Zahl"', ich brauchte aber '"Zahl": Zahl'.

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

Thorsten Pferdekaemper

Zitat von: DeeSPe am 29 März 2017, 15:39:22Ich hatte das Problem beim Erstellen von JSON.
Aus sprintf("%1f",Zahl) wurde immer '"Zahl": "Zahl"', ich brauchte aber '"Zahl": Zahl'.
Ah, das kann sein. JavaScript könnte dann mit "42" als Zahl Probleme haben.
Gruß,
   Thorsten
FUIP

devil77

Das hat mich auf die richtige Spur gebracht. Er hat die Werte beim Thermostat selber gesucht und nicht beim at, wo sie hinterlegt waren.

Zitat von: Thorsten Pferdekaemper am 29 März 2017, 15:10:40
Hi,
Du verwendest $DEVICE sowohl für den Namen des at (das ist ein at, kein Dummy), als auch für den Namen des Thermostats. Ich vermute, dass Du Deine Funktion mit dem Namen des Thermostats aufrufst, aber der hat halt kein Reading "Zieltemperatur".
Außerdem: Lass das Attribut userattr weg. Das verwirrt nur, da das at dadurch zwei Attribute bekommt, die genauso heißen wie Deine zwei Readings.
Gruß,
   Thorsten


Nur stellt sich mir jetzt die Frage ob ich beide Sachen (Thermostat und at) in der Funktion abrufen kann?
Also quasi übergebe ich nur das Thermostat als Wert und die Readingsholt er sich vom at?
Kann ich das als Variable übergeben oder ist das nicht möglich?
Momentan habe ich das erstmal so gelöst das ich das Thermostat und das at in der Funktion übergebe, also

{aufheizen("Thermostat","at")}

Thorsten Pferdekaemper

Hi,
das kommt darauf an. Wenn der Name des at mit dem Namen des Thermostats irgendwie zusammenhängt, dann kann man das bestimmt programmieren. Andererseits: Wozu? So ist das ganze flexibler und wahrscheinlich auch einfacher.
Gruß,
   Thorsten
FUIP