String in Zahl umwandeln für Rechenoperation

Begonnen von hadenia, 29 Dezember 2021, 21:43:00

Vorheriges Thema - Nächstes Thema

hadenia

Angeregt durch dieses Howto https://waschto.eu/2017/02/06/stromkosten-als-diagramm-darstellen/ möchte ich den Stromverbrauch meiner Aktoren tracken. Ich scheitere bei einem Tarif mit 2 verschiedenen Preisen an der Multiplikation des Stromverbrauchs mit dem aktuellen Preis.

Der aktuelle Preis ist im Dummy TAkt_Preis gespeichert:

Internals:
   FUUID      61cb35eb-f33f-9228-b182-1a728b1869e76351
   NAME       TAkt_Preis
   NR         71
   STATE      0.19
   TYPE       dummy
   READINGS:
     2021-12-29 21:03:13   state           0.19
Attributes:


Die Multiplikation erfolgt jede Minute im dummy ST_14_StromkostenTag, getriggert durch ein at. Wenn ich die Stromkosten 0.19 händisch im Userreading angebe, funktioniert die Berechnung:


Internals:
   FUUID      61cb5eef-f33f-9228-0b18-977bc6f5f09f5f5e
   NAME       ST_14_StromkostenTag
   NR         80
   STATE      ???
   TYPE       dummy
   READINGS:
     2021-12-29 21:26:20   Kosten          0.6935
     2021-12-29 21:26:20   Verbrauch       3.65 kWh
Attributes:
   userReadings Kosten {ReadingsVal("ST_14_StromkostenTag","Verbrauch",0)*0.19}


Egal was ich probiert habe, die Variable für den Strompreis aus dem Dummy TAkt_Preis auszulesen, es erscheint eine Fehlermeldung die ich so interpretiere, dass die Zahl 0.19 als String verarbeitet wird, womit eine Multiplikation nicht möglich ist:

Internals:
   FUUID      61cb5eef-f33f-9228-0b18-977bc6f5f09f5f5e
   NAME       ST_14_StromkostenTag
   NR         80
   STATE      ???
   TYPE       dummy
   READINGS:
     2021-12-29 21:22:20   Kosten          Error evaluating ST_14_StromkostenTag userReading Kosten: Can't use string ("0.19") as a symbol ref while "strict refs" in use at (eval 143) line 1.

     2021-12-29 21:22:20   Verbrauch       3.65 kWh
Attributes:
   userReadings Kosten {{ReadingsVal("ST_14_StromkostenTag","Verbrauch",0)}*{ReadingsNum("TAkt_Preis","state",2)}}


Für mich sieht die Variable 0.19 in "state" nach einer Zahl aus, warum der Wert nicht so behandelt wird, habe ich trotz 2 Tagen googeln und probieren nicht verstanden. Hier nur 3 Beispiele von vielen Versuchen:

Kosten {{ReadingsVal("ST_14_StromkostenTag","Verbrauch",0)}*{my $val = ReadingsVal("TAkt_Preis","state",0)}}
Fehlermeldung:
Kosten      Error evaluating ST_14_StromkostenTag userReading Kosten: Can't use string ("0.1949") as a symbol ref while "strict refs" in use at (eval 26849) line 1.    2021-12-29 20:40:43
Verbrauch   3.55 kWh   2021-12-29 20:40:43

und

Kosten {{ReadingsVal("ST_14_StromkostenTag","Verbrauch",0)}*{ReadingsVal("TAkt_Preis","state",0)}}
Fehlermeldung:
Kosten   Error evaluating ST_14_StromkostenTag userReading Kosten: Can't use string ("0.1949") as a symbol ref while "strict refs" in use at (eval 193) line 1.

und

Kosten {{ReadingsVal("ST_14_StromkostenTag","Verbrauch",0)}*{my $val = Value("TAkt_Preis")}}


Wäre schön wenn einer der Cracks hier einen Tipp für mich hat, was ich falsch mache.

Im Voraus vielen Dank!

MadMax-FHEM

#1
Zu viele Klammern.

{ - > Wechsel zu Perl
Da dann alles machen und dann }

Also: {ReadingsVal("Device1","Reading1","") * ReadingsVal("Device2","Reading2","") }

EDIT: weil es ist nach der geschweiften Klammer zu ja schon wieder Ende mit Perl, dann kommt "Sternchen" und dann wieder Perl (weil außerhalb von den geschweiften Klammern ist das * ein Sternchen, nur innerhalb ist es eine Multiplikation)... https://wiki.fhem.de/wiki/Klammerebenen

EDIT:
ABER: nimm ReadigsNum, wenn du Zahlen willst
Und: warum dummy und noch dazu 2 Stück? Warum ein at für ein userReadings? Wie soll das gehen?
EDIT: weil statt mit einem at ein userReadings zu triggern kannst/könntest du auch gleich im at rechnen und das Reading dann einfach per "setreading Device Reading Wert" setzen... Aber wie folgt würde ich das ja ganz anders machen... Weg von den dummy!!!!

Hast du kein Device was dir den Verbrauch "mitteilt"? Wie wird denn der Verbrauch von dummy ST_14_StromkostenTag gefüllt? Mach doch dort ein userReadings! Und dann würde ich die Stromkosten (sind ja verm. nicht so variabel) als userattr und frag dann das Attribut ab: AttrVal/AttrNum...

Poste doch mal ein list von dem Device, das den Verbrauch hat (nicht von dem dummy, sondern dort von wo der dummy befüllt wird)...

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)

Benni

#2
Zitat von: MadMax-FHEM am 29 Dezember 2021, 21:47:39
{ - > Wechsel zu Perl
Da dann alles machen und dann }

Also: {ReadingsVal("Device1","Reading1","") * ReadingsVal("Device2","Reading2","") }


Und idealerweise verwendet man ReadingsNum! ;)

EDIT:

Zitat von: MadMax-FHEM am 29 Dezember 2021, 21:47:39
EDIT:
ABER: nimm ReadigsNum, wenn du Zahlen willst

zu spät gesehen!

gb#

MadMax-FHEM

#3
Zitat von: Benni am 29 Dezember 2021, 21:59:54
Und idealerweise verwendet man ReadingsNum! ;)

gb#

Jep oder gleich ganz anders :)

EDIT: weil die Anleitung ist ja schon fast 5 Jahre alt... ;)

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)

hadenia

Es klappt! Bei dem Hinweis auf { - > Wechsel zu Perl hat es Klick gemacht  ;)

Um eure Fragen bzw. Hinweise zu kommentieren:

Den Stromverbrauch lese ich aus verschiedenen Devices.

Da ich das System flexibel halten möchte um auch spätere Tarifwechsel ohne Programmieränderung berechnen zu können, speichere ich den Namen des Tarifs und den zugehörigen Strompreis in einem Dummy. Zur Erklärung, es gibt Tarif mit 1,2 oder 3 verschiedenen Strompreisen pro Tag. Je nach Uhrzeit schreibt das at den Namen und den zugehörigen Preis tageszeitabhängig in eben dieses Dummy und alle Berechnungen werden mit den Werten aus diesem Dummy durchgeführt. Bei ANbieter- oder Tariefwechsel muss dann nur das at angepasst werden.

Dummy´s zusammenfassen und den Code vereinfachen kann ich erst machen, wenn es mal grundsätzlich läuft. Habe früher viel in Pascal gemacht, aber bzgl. Pearl bin ich noch absoluter Anfänger.
Momentan bin ich schon froh, wenn es überhaupt funktioniert.  ;) Wenn alles läuft, schreibe ich einen Wiki-Artikel.

Nochmals vielen Dank für eure tolle und schnelle Hilfe!


betateilchen

Zitat von: hadenia am 30 Dezember 2021, 08:41:36
aber bzgl. Pearl bin ich noch absoluter Anfänger.
...
Wenn alles läuft, schreibe ich einen Wiki-Artikel.

solange man nicht imstande ist, die verwendete Programmiersprache korrekt zu schreiben, klingt die Ankündigung eines WIKI Artikels eher wie eine Drohung...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!