FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: riker1 am 06 Oktober 2020, 07:23:19

Titel: (solved) sunrise offset berechnen mit negativer multiplikation
Beitrag von: riker1 am 06 Oktober 2020, 07:23:19
EDIT : Solved:
- FHEM update hat scheinbar einiges bereinigt.
Nun geht es wie erwartet.




Hallo

ich wollten den Offset variabel halten und habe ihn mit einem dummy berechnet.

da ich dann den Offset mal vor bzw. nach Sonnenaufgang/-untergang benötige dachte ich ich multipliziere ihn mit -1.
Ein einfaches Voranstellen von  Minus geht ja wohl nicht : sunrise(-Value("Z_V_SunRiseSet_Offset")


*{sunrise(Value("Z_V_SunRiseSet_Offset")*-1,"06:30","09:15")} set TA_ESP0128 open

habe das dann geändert in :  (erst ReadingsVal , dann nun ReadingsNum)
*{sunrise(ReadingsNum("Z_V_SunRiseSet_Offset")*-1,"06:30","09:15")} set TA_ESP0128 open

Trotzdem kommt immer noch die Perl Warning.  Warum verstehe ich nicht.

2020.10.06 06:37:59.913 1: PERL WARNING: Argument "" isn't numeric in multiplication (*) at (eval 444) line 1, <$fh> line 22718.
2020.10.06 06:37:59.913 1: eval: {sunset((ReadingsNum('Z_V_SunRiseSet_Offset','state','')*-1),"16:00","21:50")}
2020.10.06 06:37:59.913 1: stacktrace:



Kennt jemand den Grund ?

Danke für die Hilfe

VG T


Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: betateilchen am 06 Oktober 2020, 08:21:22
ZitatReadingsNum("Z_V_SunRiseSet_Offset")

Falsche Syntax bei der Verwendung von ReadingsNum().

Korrekt wäre beispielsweise


ReadingsNum('Z_V_SunRiseSet_Offset','state',0)
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: Nobbynews am 06 Oktober 2020, 08:25:26
Abgesehen davon, dass die Syntax falsch ist, würde ich es mal mit
...)*(-1)
versuchen.
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: riker1 am 06 Oktober 2020, 09:19:47
Zitat von: betateilchen am 06 Oktober 2020, 08:21:22
Falsche Syntax bei der Verwendung von ReadingsNum().

Korrekt wäre beispielsweise


ReadingsNum('Z_V_SunRiseSet_Offset','state',0)


sorry , das war falsch von mir gepostet. hatte das schon so gemacht. -> trotzdem der Fehler non numeric,

Werde es mal mit *(-1) versuchen.

Melde mich dann Danke

Update. Scheinbar hat das Klammer geholfen. 
{sunset(ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state','')*(-1))}
in der Commandozeile liefert korrektes ergebnis.

So einfach kann es sein.

Nochmal eine Verständnisfrage hierzu bzw . zu dem Defaultwert. Etwas off Topic .

ReadingsNum('device','state','')

Wenn ich ein numerisches Feld erwarte, mit ReadingsNum,  dann mit sprintf formatiere und der Default Wert is '' , gibt das dann eine non PERL Numeric Warning
Muss man besser immer ein numerischen Default werde setzen wie -1 ?

Danke für die Hilfe

VG T

Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: riker1 am 06 Oktober 2020, 10:22:46
Mist, leider zu früh gefreut.


immer noch die Meldung Warning non numeric

sogar in 2 verschiedenen Versionen:

Testweise: mit Value("dev") unabhängig von der -1 Multiplikation  und ReadingNum()

Es ist zwar nur ein Warning, müllt mir aber das Log voll.

   
{sunset(ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state','')*(-1))}

2020.10.06 10:09:59.210 1: PERL WARNING: Argument "" isn't numeric in multiplication (*) at (eval 461) line 1, <$fh> line 23568.
2020.10.06 10:09:59.210 1: eval: {sunset(ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state','')*(-1))}
2020.10.06 10:09:59.210 1: stacktrace:
2020.10.06 10:09:59.210 1:     main::__ANON__                      called by (eval 461) (1)
2020.10.06 10:09:59.210 1:     (eval)                              called by fhem.pl (1149)
2020.10.06 10:09:59.211 1:     main::AnalyzePerlCommand            called by fhem.pl (1178)
2020.10.06 10:09:59.211 1:     main::AnalyzeCommand                called by fhem.pl (3630)
2020.10.06 10:09:59.211 1:     main::GetTimeSpec                   called by ./FHEM/90_at.pm (76)
2020.10.06 10:09:59.211 1:     main::at_Define                     called by fhem.pl (3806)
2020.10.06 10:09:59.211 1:     main::CallFn                        called by fhem.pl (2103)
2020.10.06 10:09:59.211 1:     main::CommandDefine                 called by fhem.pl (1254)
2020.10.06 10:09:59.211 1:     main::AnalyzeCommand                called by fhem.pl (1105)
2020.10.06 10:09:59.211 1:     main::AnalyzeCommandChain           called by fhem.pl (1392)
2020.10.06 10:09:59.211 1:     main::CommandInclude                called by fhem.pl (616)
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: Nobbynews am 06 Oktober 2020, 10:47:24
Zitat von: riker1 am 06 Oktober 2020, 10:22:46
{sunset(ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state','')*(-1))}
Kann es sein, dass der Defaultwert bei dieser Schreibweise quasi undefiniert ist?
Was passiert denn bei:
{sunset(ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state','0')*(-1))}
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: riker1 am 06 Oktober 2020, 10:52:21
Zitat von: Nobbynews am 06 Oktober 2020, 10:47:24
Kann es sein, dass der Defaultwert bei dieser Schreibweise quasi undefiniert ist?
Was passiert denn bei:
{sunset(ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state','0')*(-1))}

das probiere ich mal.

Allerdings ist der Wert gesetzt in dem Fall und der Default greift nicht ( sollte) .

denke aber das '0' bei ReadingsNum auch zu Problemen führt und denke es sollte default nur 0  ohne ' sein.

ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state',0)   --deshalb der Vermerk zu Sprintf Warning - siehe oben. die ich bei anderen Defaults habe und die Ursache für mich auch noch unklar ist.

Danke
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: Nobbynews am 06 Oktober 2020, 12:37:54
Zitat von: riker1 am 06 Oktober 2020, 10:52:21
Allerdings ist der Wert gesetzt in dem Fall und der Default greift nicht ( sollte) .
Das sollte so sein.
Wie sieht denn ein List vom dummy Z_V_SunRiseSet_Offset_Plus aus?
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: MadMax-FHEM am 06 Oktober 2020, 13:32:47
Zitat von: riker1 am 06 Oktober 2020, 09:19:47
sorry , das war falsch von mir gepostet. hatte das schon so gemacht. -> trotzdem der Fehler non numeric,

Warum postest du (und andere) nicht GENAU DAS was sie versucht haben und GENAU DAS was den Fehler geworfen hat!?

Auch sowas wie: ich hab das mal vereinfacht aber das Prinzip ist dasselbe...
(das werde ich nie verstehen!)


Zitat von: riker1 am 06 Oktober 2020, 10:52:21
das probiere ich mal.

Allerdings ist der Wert gesetzt in dem Fall und der Default greift nicht ( sollte) .

denke aber das '0' bei ReadingsNum auch zu Problemen führt und denke es sollte default nur 0  ohne ' sein.

ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state',0)   --deshalb der Vermerk zu Sprintf Warning - siehe oben. die ich bei anderen Defaults habe und die Ursache für mich auch noch unklar ist.

Danke

Wer lesen kann ;)

https://forum.fhem.de/index.php/topic,114794.msg1090196.html#msg1090196

Natürlich sollte (muss, gut Perl ist da recht "flexibel") der Default-Wert bei ReadingsNum numerisch sein... ;)

Gruß, Joachim
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: betateilchen am 06 Oktober 2020, 13:39:06
Zitat von: riker1 am 06 Oktober 2020, 10:22:46
Testweise: mit Value("dev")

Streiche bitte die Funktion Value() komplett aus Deinem Denken. Damit arbeitest Du überhaupt nicht mit einem reading, sondern mit einem Internal. Und das möchte man in den allerwenigsten Fällen tatsächlich. Insbesondere, da in diesem Internal Werte auftauchen können, die Du überhaupt nicht erwartest.

Zitat von: riker1 am 06 Oktober 2020, 09:19:47
ReadingsNum('device','state','')

Wenn ich ein numerisches Feld erwarte, mit ReadingsNum,  dann mit sprintf formatiere und der Default Wert is '' , gibt das dann eine non PERL Numeric Warning
Muss man besser immer ein numerischen Default werde setzen wie -1 ?

Wenn man mit ReadingsNum() arbeitet, sollte der Defaultwert immer ein numerischer Wert sein.
In allen anderen Fällen sollte man ReadingsVal() verwenden.

Zitat von: Nobbynews am 06 Oktober 2020, 08:25:26
würde ich es mal mit
...)*(-1)
versuchen.

Das ist totaler Quatsch.
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: riker1 am 06 Oktober 2020, 13:57:12
Zitat von: Nobbynews am 06 Oktober 2020, 12:37:54
Das sollte so sein.
Wie sieht denn ein List vom dummy Z_V_SunRiseSet_Offset_Plus aus?

eigentlich ganz simpel.

Internals:
   FUUID      5e77927c-f33f-74bb-08ce-15f0f64778f19e22
   NAME       Z_V_SunRiseSet_Offset_Plus
   NR         106315
   STATE      3600
   TYPE       dummy
   READINGS:
     2020-10-01 20:40:35   state           3600
Attributes:
   room       Z_Control,Z_Variablen
   verbose    0
   webCmd     0:900:1800:2700:3600:5600:7200
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: Nobbynews am 06 Oktober 2020, 14:03:11
Zitat von: betateilchen am 06 Oktober 2020, 13:39:06
Das ist totaler Quatsch.
Na ja, schaden tun die Klammern jedenfalls nicht.
Es funktioniert aber auch ohne.
Versuch macht halt kluch.....
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: betateilchen am 06 Oktober 2020, 14:08:22
Zitat von: Nobbynews am 06 Oktober 2020, 14:03:11
Na ja, schaden tun die Klammern jedenfalls nicht.

In diesem Fall zufälligerweise (!) nicht. An anderen Stellen in perl code können "auf Verdacht gesetzte" Klammern aber zu unerwarteten Ergebnissen führen.
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: Nobbynews am 06 Oktober 2020, 14:56:13
Tja, gerade if-Abfragen mit &&, || usw. sind da sicher entsprechende Kandidaten.
Aber bei einem numerischen Wert????
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: riker1 am 06 Oktober 2020, 19:43:47
Hallo
leider geht es sogar mit einem negativen Wert auch nicht. Ohne Multiplikation.

aber keine Warning im log. aber das ReadingsNum wird einfach ignoriert scheinbar nicht aufgelöst.

{sunset(ReadingsNum('Z_V_SunRiseSet_Offset_Minus','state',0))}



ein negativer und positiver  Wert direkt geht aber als fixer Eintrag.







Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: betateilchen am 06 Oktober 2020, 20:44:52
Bei mir funktioniert das völlig problemlos, sowohl mit als auch ohne Multiplikation.


defmod Z_V_SunRiseSet_Offset_Minus dummy

setstate Z_V_SunRiseSet_Offset_Minus 3600
setstate Z_V_SunRiseSet_Offset_Minus 2020-10-06 20:38:40 state 3600


damit liefert

{sunset(ReadingsNum('Z_V_SunRiseSet_Offset_Minus','state',0)*-1)}

als Ergebnis: 42:21:21 (also morgen um 18:21:21)

Mit
{sunset(ReadingsNum('Z_V_SunRiseSet_Offset_Minus','state',0))}

bekomme ich als Ergebnis 44:21:21 (also morgen um 20:21.21)

Beide Ergebnis werden völlig korrekt berechnet, die Differenz beträgt genau zwei Stunden.
Titel: Antw:sunrise offset berechnen mit negativer multiplikation bringt PERL Warning not nu
Beitrag von: riker1 am 06 Oktober 2020, 22:02:12
Hi

merkwürdig.

Bei mir geht es jetzt auch.

Hatte ein Fhem update gemacht. Eventuell war was am System defekt?

ich teste es nochmal durch.

Vielen vielen Danke für die Hilfe


EDIT:;
Also es geht . Es lag wohl an inkonsistenzen im System for dem Update. (Erklären kann ich mir das nicht)


defmod Z_Sunrise_hell_test at *{sunrise(ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state',0))} {fhem("set Tageslicht_test ja". sunrise());;\
fhem("setreading Tageslicht_test 0_Offset_plus ". sunrise(ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state',0)));;\
fhem("setreading Tageslicht_test 0_Offset_minus ". sunrise(ReadingsNum('Z_V_SunRiseSet_Offset_Plus','state',0)*-1));;\
fhem("setreading Tageslicht_test 0_Offset_Minus2 ". sunrise(ReadingsNum('Z_V_SunRiseSet_Offset_Minus','state',0)));;\
fhem("setreading Tageslicht_test 0_Offset_Plus2 ". sunrise(ReadingsNum('Z_V_SunRiseSet_Offset_Minus','state',0)*-1))\
}



nach Exec Now: sehen sie state-Werte gut aus.

setstate Tageslicht_test ja31:06:03
setstate Tageslicht_test 2020-10-06 22:15:08 0_Offset_Minus2 30:06:03
setstate Tageslicht_test 2020-10-06 22:15:08 0_Offset_Plus2 32:06:03
setstate Tageslicht_test 2020-10-06 22:15:08 0_Offset_minus 30:06:03
setstate Tageslicht_test 2020-10-06 22:15:08 0_Offset_plus 32:06:03
setstate Tageslicht_test 2020-10-06 22:15:08 state ja31:06:03