[gelößt] Nutzung von Variablen im profileparameter beim WeekdayTimer

Begonnen von th0nix, 19 April 2020, 13:57:51

Vorheriges Thema - Nächstes Thema

th0nix

Hallo zusammen,

ich verwendeWeekdayTimer zur Heizungssteuerung. Nun möchte ich gerne die Temperaturen, welche eingestellt werden wollen über eine dummy Device (Variable) via Slider einstellen. Ich habe es leider bisher nicht geschafft das zum Funktionieren zu bekommen.
Daher die Frage ist das überhaupt machbar? Muss ich ggf über Perl Variablen gehen ? Wenn ja wie würde das gehen?

Vielen Dank schon mal für die Hilfe

Gedanklich hatte ich den PseudoCode im Kopf:

# Variablen
define HEITZUNG.Morgens dummy
define HEITZUNG.Tags dummy
attr HEITZUNG.Morgens setList state:slider,10,1,30
attr HEITZUNG.Tags setList state:slider,10,1,30

#Timer:
define HEITUNGS.TIMER WeekdayTimer HEITZUNG mo-fr|05:30|[HEITZUNG.Morgens ] mo-fr|07:30|[HEITZUNG.tags] sa-su|08:00|[HEITZUNG.Morgens] sa-su|09:00|[HEITZUNG.Tags] {fhem("set $NAME desired-temp $EVENT)}


Thonix

amenomade

#1
Ich habe es nie probiert, aber es sollte mit "command" gehen:

define HEITUNGS.TIMER WeekdayTimer HEITZUNG mo-fr|05:30|morgens mo-fr|07:30|tags sa-su|08:00|morgens sa-su|09:00|tags {my $target = ($EVENT eq "morgens") ? Value("HEITZUNG.Morgens") : Value ("HEITZUNG.Tags"); fhem("set $NAME desired-temp $target)}

PS: HEIZUNG nimmt kein T ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

th0nix

Vielen Dank - mit ein wenig tuning hat es top funktioniert.
Hast du noch eine Idee wie es geht wenn ich neben Morgens und Tags noch ein Abend hinzufügen möchte.
Habe mich nun lange an einer eleganten Perl IF Geschichte versucht, bekomme aber immer Ärger mit dem Scope der Variablen.... Habe jetzt aus meiner Sicht sehr unschöner code ... ::)

my $var = Value("Tags"); if ($EVENT = "Tags") {fhem("set ... $var")};
my $var = Value("Morgens"); if ($EVENT = "Morgens") {fhem("set ... $var")};
my $var = Value("Nachts"); if ($EVENT = "Nachts") {fhem("set ... $var")};


Typos bei der Heizung sind nur zur Verwirrung  8)


Beta-User

Moin zusammen,

ein paar Gedanken dazu:

- Value() finde ich schwierig: Mach' via stateFormat ein "°C" dazu und es funktioniert nicht mehr... => besser ReadingsVal/ReadingsNum verwenden.

- Warum nicht ein dummy mit allen Werten? Dann kannst du das einzelne Reading passend zum Event benennen und brauchst nur eine einfache Abfrage.

- Generell willst du es wohl flexibel haben. Vielleicht schaust du dir mal die Kombi weekprofile+WeekdayTimer an; nutzt man am weekprofile "Topic", kann man mit einem einzigen Befehl den Heizungsmodus des ganzen Hauses umstellen. Das ist dann richtig flexibel, und für die Profile selbst gibt es ein FHEMWEB-widget... Ist aber erst etwas Aufwand, bis man sich eingedacht hat.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

th0nix

#4
Hallo zusammen, ich muss das Thema nochmal aufmachen - es funktioniert leider nicht so wie gedacht.
Folgendes habe ich nun "zusammengebaut":

define BZ.HEITZUNG.Morgens dummy
attr BZ.HEITZUNG.Morgens setList state:slider,10,1,30
attr BZ.HEITZUNG.Morgens webCmd state


define BZ.HEITZUNG.Tags dummy
attr BZ.HEITZUNG.Tags setList state:slider,10,1,30
attr BZ.HEITZUNG.Tags webCmd state

define BZ.HEITZUNG.Nachts dummy
attr BZ.HEITZUNG.Nachts setList state:slider,10,1,30
attr BZ.HEITZUNG.Nachts webCmd state

# werte zuweisen
set BZ.HEITZUNG.Morgens 24.5
set BZ.HEITZUNG.Tags 21.0
set BZ.HEITZUNG.Nachts 18.0


Nun möchte ich ja die Variablen in dem WeekdayTimer einbauen.
Folgende Versuche waren leider erfolglos:
1)
define BZ.HEITUNGS.TIMER.TEMP WeekdayTimer BZ.HEITZUNG.TS mo-fr|05:30|BZ.HEITZUNG.Morgens mo-fr|07:30|BZ.HEITZUNG.Tags mo-fr|20:00|BZ.HEITZUNG.Nachts sa-su|08:00|BZ.HEITZUNG.Morgens sa-su|10:00|BZ.HEITZUNG.Tags sa-su|20:00|BZ.HEITZUNG.Nachts {fhem("set $NAME desired-temp $EVENT;; set BZ.HEITZUNG.STATUS $EVENT")}
Ergebnis:
2020.09.06 20:10:00 3: set BZ.HEITZUNG.TS desired-temp BZ.HEITZUNG.Nachts; set BZ.HEITZUNG.STATUS BZ.HEITZUNG.Nachts : wrong format, see commandref
2020.09.06 20:10:00 3: wrong format, see commandref


2)
define BZ.HEITUNGS.TIMER.TEMP WeekdayTimer BZ.HEITZUNG.TS mo-fr|05:30|[BZ.HEITZUNG.Morgens:state] mo-fr|07:30|[BZ.HEITZUNG.Tags:state] mo-fr|20:00|[BZ.HEITZUNG.Nachts:state] sa-su|08:00|[BZ.HEITZUNG.Morgens:state] sa-su|10:00|[BZ.HEITZUNG.Tags:state] sa-su|20:00|[BZ.HEITZUNG.Nachts:state] {fhem("set $NAME desired-temp $EVENT;; set BZ.HEITZUNG.STATUS $EVENT")}

Ergebnis:
2020.09.06 20:10:00 3: set BZ.HEITZUNG.TS desired-temp [BZ.HEITZUNG.Nachts state]; set BZ.HEITZUNG.STATUS [BZ.HEITZUNG.Nachts state] : wrong format, see commandref
2020.09.06 20:10:00 3: wrong format, see commandref


3)
define BZ.HEITUNGS.TIMER.TEMP WeekdayTimer BZ.HEITZUNG.TS mo-fr|05:30|ReadingsVal("BZ.HEITZUNG.Morgens","state",0) mo-fr|07:30|ReadingsVal("BZ.HEITZUNG.Tags","state",0) mo-fr|20:00|ReadingsVal("BZ.HEITZUNG.Nachts","state",0)  sa-su|08:00|ReadingsVal("BZ.HEITZUNG.Morgens","state",0) sa-su|10:00|ReadingsVal("BZ.HEITZUNG.Tags","state",0) sa-su|20:00|ReadingsVal("BZ.HEITZUNG.Nachts","state",0) {fhem("set $NAME desired-temp $EVENT;; set BZ.HEITZUNG.STATUS $EVENT")}

Ergebnis:
2020.09.06 20:10:00 1: PERL WARNING: Bareword found where operator expected at (eval 132) line 1, near ""ReadingsVal("BZ"
2020.09.06 20:10:00 3: eval: my $EVTPART0='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';my $NAME='BZ.HEITZUNG.TS';my $EVENT='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';{fhem("set $NAME desired-temp $EVENT; set BZ.HEITZUNG.STATUS $EVENT")}
2020.09.06 20:10:00 1: PERL WARNING: (Missing operator before BZ?)
2020.09.06 20:10:00 3: eval: my $EVTPART0='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';my $NAME='BZ.HEITZUNG.TS';my $EVENT='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';{fhem("set $NAME desired-temp $EVENT; set BZ.HEITZUNG.STATUS $EVENT")}
2020.09.06 20:10:00 1: PERL WARNING: String found where operator expected at (eval 132) line 1, near "Nachts",""
2020.09.06 20:10:00 3: eval: my $EVTPART0='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';my $NAME='BZ.HEITZUNG.TS';my $EVENT='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';{fhem("set $NAME desired-temp $EVENT; set BZ.HEITZUNG.STATUS $EVENT")}
2020.09.06 20:10:00 1: PERL WARNING: Bareword found where operator expected at (eval 132) line 1, near "","state"
2020.09.06 20:10:00 3: eval: my $EVTPART0='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';my $NAME='BZ.HEITZUNG.TS';my $EVENT='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';{fhem("set $NAME desired-temp $EVENT; set BZ.HEITZUNG.STATUS $EVENT")}
2020.09.06 20:10:00 1: PERL WARNING: (Missing operator before state?)
2020.09.06 20:10:00 3: eval: my $EVTPART0='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';my $NAME='BZ.HEITZUNG.TS';my $EVENT='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';{fhem("set $NAME desired-temp $EVENT; set BZ.HEITZUNG.STATUS $EVENT")}
2020.09.06 20:10:00 1: PERL WARNING: String found where operator expected at (eval 132) line 1, near "state",0)""
2020.09.06 20:10:00 3: eval: my $EVTPART0='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';my $NAME='BZ.HEITZUNG.TS';my $EVENT='ReadingsVal("BZ.HEITZUNG.Nachts","state",0)';{fhem("set $NAME desired-temp $EVENT; set BZ.HEITZUNG.STATUS $EVENT")}
2020.09.06 20:10:00 3: set BZ.HEITZUNG.TS desired-temp ReadingsVal("BZ.HEITZUNG.Nachts","state",0); set BZ.HEITZUNG.STATUS ReadingsVal("BZ.HEITZUNG.Nachts","state",0) : syntax error at (eval 132) line 1, near ""ReadingsVal("BZ"
2020.09.06 20:48:48 3: syntax error at (eval 132) line 1, near ""ReadingsVal("BZ"


Hat hier noch jemand eine Idee ?

PS: Meine Heizung hat immer noch ein T dabei  ;D

amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

th0nix

Zitat von: amenomade am 06 September 2020, 21:10:04
Variante 1 mit set $NAME desired-temp [$EVENT:state]?

:D - TOP das war es - klappt mit Variante 1 super!