[Gelöst] Syntaxprobleme / Rechnen mit Variablen / Variablen ausgeben

Begonnen von FLOK, 06 November 2015, 09:31:31

Vorheriges Thema - Nächstes Thema

FLOK

Guten Morgen,

als absoluter Anfänger und ohne Ahnung von perl, tue ich mir doch etwas schwer...
Aber immerhin läuft schon was :-)

Alles was ich bisher mache ist Spielerei um mit dem System "warm" zu werden.
Also zum Thema:

Ich habe mir einen Dummy Schatler gebastelt: "Boost_30min".
Sobald dieser angeschaltet wird, soll ein anderer Schalter "Sparmodus_Kueche" ausgeschaltet werden,
die "boostDuration" meines MAX-Thermostats ausgelesen werden, das Thermostat in den boost Modus gehen,
gewartet werden (sleep "boostDuration" * 60) und anschließend der Schalter wieder "off" gesetzt werden.

Eigentlich nicht viel, dachte ich....

Hier der Code:

define n_Boost30_an notify Boost_30min:on \
my $boosttime= ReadingsVal("Kueche", "boostDuration", 30);; \
set Sparmodus_Kueche off ;; \
set Kueche desiredTemperature boost ;; \
sleep ($boosttime *60) ;; \
set Boost_30min off


Problem ist, die "sleep" Zeit. Das Log gibt mir: Cannot interpret ($boosttime as seconds
Leider weiß ich nicht, was er ausgelesen hat, daher die Frage, wie kontrolliere ich den Wert $boosttime ?
Eine Ausgabe im Log, Web oder EventMonitor wäre schön.

Ist denn eine Deklaration mit Berechnung so "sleep ($boosttime *60)" überhaupt möglich ?

Helft mir doch mal bitte auf die Sprünge.

Gruß
Florian

betateilchen

  return "Cannot interpret $sec as seconds" if($sec !~ m/^[0-9\.]+$/);

Das heißt, sleep (das ist ein fhem Befehl und keine Funktion!) kann nur direkt mit Zahlenwerten aufgerufen werde und nicht mit Rechenergebnissen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

FLOK

Heißt im Klartext, keine Variable möglich ?!
Schade....


justme1968

#3
dein problem ist das du an mehreren stellen die fhem und die perl ebene mischst.

my ... ist perl
$boosttime *60 ist perl
sleep(...) ist perl

dein notify ist aber nicht in {} eingeschlossen und deshalb stehen dir dort 'nur' die fhem kommandos zur verfügung.

eine möglichkeit das zu lösen ist ein notify auf perl ebene zu verwenden um dort rechnen zu können und dann fhem aus der perl ebene mit dem ergebniss aufzurufen.

also z.b. etwas in der art:
Boost_30min:on {
my $boosttime= ReadingsVal("Kueche", "boostDuration", 30) * 60;
fhem( "set Sparmodus_Kueche off;set Kueche desiredTemperature boost;sleep $boosttime; set Boost_30min off" );
}


gruss
  andre

ps: du machst es dir einfacher wenn du es im DEF bereich eingibst. das notify ist langsam lang genug um es in 99_myUtils.pm auszulagern. du musst aufpassen das du das richtige sleep verwendest. perl sleep blockiert fhem. nur fhem sleep ist ok.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

FLOK

Oh, ich mische schon  :-\


define n_Boost30_an notify Boost_30min:on {\
my $boosttime= ReadingsVal("Kueche", "boostDuration", 30) * 60;
fhem( "set Sparmodus_Kueche off;set Kueche desiredTemperature boost;sleep $boosttime; set Boost_30min off" );
}


führt zu

Error messages while initializing FHEM:
configfile: Unknown command fhem(, try help.
Cannot interpret $boosttime as seconds
Unknown command }, try help.


beim Start.

justme1968

nicht ins config file eintragen sondern im DEF bereich im web frontend editieren.

wenn du es selber ins config file einträgst musst du dich selber um das maskieren von zeilenenden und ; kümmern.

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

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

FLOK

Okay, das klappt !
Schön zu sehen, was er dann im config-File macht.
Das hilft um die Syntax zu verstehen:


define n_Boost30_an notify Boost_30min:on {\
my $boosttime= ReadingsVal("Kueche", "boostDuration", 30) * 60;;\
fhem( "set Sparmodus_Kueche off;;set Kueche desiredTemperature boost;;sleep $boosttime;; set Boost_30min off" );;\
}\


Kannst du mir auf einfachem Wege auch erklären, wie
ich diese Variable "$boosttime" irgendwo ausgeben kann?
Am liebsten im WebInterface.

justme1968

was meinst du mit ausgeben?

ins log schreibst du z.b. mit Log 3, "boosttime: $boosttime";

ins web interface kannst du nicht einfach etwas ausgeben. aber der wert steht doch in deinem reading.

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

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

FLOK

Das mit dem Log ist schon mal hilfreich, danke.
Es geht mir jetzt nicht speziell um diese Variable, eher allgemein.

Kann ich denn einen Dummy anlegen, der statt ein Schalter eben eine Dezimale Ausgabe hat
und diesen im Web sichtbar machen?

justme1968

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

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

FLOK

Danke, werde ich tun.
Manchmal ist es schwer, die richtigen Befehle zu finden  :-[