Hallo. Habe folgendes DOIF
Internals:
CFGFN
DEF ([Buderus:OutdoorTemp]>15) (set Buderus RoomTemporaryDesiredTemp 17)
MODEL FHEM
NAME di_Heizung
NR 16230
NTFY_ORDER 50-di_Heizung
STATE cmd_1
TYPE DOIF
READINGS:
2018-10-17 15:49:38 Device Buderus
2018-10-17 15:49:38 cmd 1
2018-10-17 15:49:38 cmd_event di_Heizung
2018-10-17 15:49:38 cmd_nr 1
2018-10-17 15:49:38 error set Buderus RoomTemporaryDesiredTemp 17: 17
2018-10-17 15:48:28 mode enabled
2018-10-17 15:49:38 state cmd_1
Regex:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Buderus','OutdoorTemp')>15
devices:
0 Buderus
all Buderus
do:
0:
0 set Buderus RoomTemporaryDesiredTemp 17
1:
helper:
event RoomDesiredTemp: 17.5
globalinit 1
last_timer 0
sleeptimer -1
timerdev
timerevent
timerevents
timereventsState
triggerDev Buderus
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: di_Heizung
error: set Buderus RoomTemporaryDesiredTemp 17: 17
state: cmd_1
triggerEvents:
RoomDesiredTemp: 17.5
triggerEventsState:
RoomDesiredTemp: 17.5
internals:
itimer:
readings:
0 Buderus:OutdoorTemp
all Buderus:OutdoorTemp
trigger:
uiState:
uiTable:
Attributes:
disable 0
room DOIF
Leider bekomme ich einen error angezeigt, schalten tut es zwar aber mich stört der error ein bisschen ::)
Im Log erscheint dazu folgendes
2018.10.17 15:49:00 1: ERROR evaluating { Buderus }: Bareword "Buderus" not allowed while "strict subs" in use at (eval 230445) line 1.
2018.10.17 15:49:35 3: Buderus set raw /heatingCircuits/hc1/temporaryRoomSetpoint value 17
2018.10.17 15:49:35 2: Buderus get /heatingCircuits/hc1/temporaryRoomSetpoint - HTTP: HTTP/1.0 200 The request has succeeded
Content-Type: application/json, data: {"id":"/heatingCircuits/hc1/temporaryRoomSetpoint","type":"floatValue","writeable":1,"recordable":0,"value":17.5,"unitOfMeasure":"C","minValue":5.0,"maxValue":30.0,"state":[{"off":0.0},{"na":-1.0}]}
2018.10.17 15:49:35 3: Buderus /heatingCircuits/hc1/temporaryRoomSetpoint set floatValue 17
2018.10.17 15:49:35 3: Buderus raw HTTP data: {"value":17}
2018.10.17 15:49:37 2: Buderus get /heatingCircuits/hc1/temporaryRoomSetpoint - HTTP: HTTP/1.0 200 The request has succeeded
Content-Type: application/json, data: {"id":"/heatingCircuits/hc1/temporaryRoomSetpoint","type":"floatValue","writeable":1,"recordable":0,"value":17.0,"unitOfMeasure":"C","minValue":5.0,"maxValue":30.0,"state":[{"off":0.0},{"na":-1.0}]}
2018.10.17 15:49:38 2: di_Heizung: set Buderus RoomTemporaryDesiredTemp 17: 17
2018.10.17 15:49:38 1: Perfmon: possible freeze starting at 15:49:36, delay is 2.014
Kann jemand daran erkennen worauf der error zurückzuführen ist?
Danke
Hi,
So würdest Du den state des Gerätes Buderus mit "RoomTemporaryDesiredTemp 17" setzen!
Das geht so sicher nicht! Es sei denn Buderus hat readingList gesetzt.
Was willst Du wirklich? Ein Reading im Gerät Buderus setzen? Dann
setreading Buderus RoomTemporaryDesiredTemp 17
Gruß Otto
Diese Fehlermeldung
Zitat2018.10.17 15:49:00 1: ERROR evaluating { Buderus }: Bareword "Buderus" not allowed while "strict subs" in use at (eval 230445) line 1.
sollte nicht vom Schaltvorgang des DOIF kommen, sie entsteht 38 s vorher.
Set scheint untypischerweise etwas zurückzugeben, das wird als Fehler interpretiert. Passiert das auch in der Befehlszeile?
Siehe auch https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche#Besonderheit_des_Error-Reading
Wenn ich das wüsste was ich will ::)
Ich habe das Modul BDKM für meine Heizung und möchte in der Set Liste was schalten.
Hier mal ein gekürztes list von dem Buderus Device
Internals:
BASEINTERVAL 120
DEF 192.168.178.99
HTTPTIMEOUT 10
INTERPOLLDELAY 0
IP 192.168.178.99
ISPOLLING 0
NAME Buderus
NR 234
READBACKDELAY 500
SEQUENCE 11
STATE idle
TYPE BDKM
VERSION $Id: 79_BDKM.pm 12770 2016-12-14 08:39:57Z arnoaugustin $
IDS:
/heatingCircuits/hc1/temporaryRoomSetpoint:
MAX 30
MIN 5
TYPE floatValue
UNIT C
VALUE 17
WRITEABLE 1
JOBQUEUE:
POLLIDS:
/heatingCircuits/hc1/temporaryRoomSetpoint:
DELTA
MODULO 1
READINGS:
2018-10-17 15:51:34 RoomDesiredTemp 17
2018-10-06 21:52:18 RoomManualDesiredTemp 21
2018-10-17 15:49:37 RoomTemporaryDesiredTemp 17
2018-10-17 16:16:50 SecondBurnerWorkingTime 0
2018-10-17 16:16:50 Status ACTIVE
REALTOUSER:
/heatingCircuits/hc1/temporaryRoomSetpoint RoomTemporaryDesiredTemp
UPDATES:
/heatingCircuits/hc1/temporaryRoomSetpoint
USERTOREAL:
/heatingCircuits/hc1/manualRoomSetpoint
RoomTemporaryDesiredTemp /heatingCircuits/hc1/temporaryRoomSetpoint
helper:
_98_statistics ST.Gasverbrauch
Attributes:
PollIds RC300DEFAULTS
event-on-change-reading .*
group Buderus
room System
Das was ich unten im Bild so setzen möchte, wollte ich im DOIF machen
Danke :D
edit
Zitat von: Ellert am 17 Oktober 2018, 17:02:42
Diese Fehlermeldungsollte nicht vom Schaltvorgang des DOIF kommen, sie entsteht 38 s vorher.
Set scheint untypischerweise etwas zurückzugeben, das wird als Fehler interpretiert. Passiert das auch in der Befehlszeile?
Siehe auch https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche#Besonderheit_des_Error-Reading
Ja die Meldung habe ich alle paar Minuten einmal... Keine Ahnung was sie bedeutet
Wenn ich set Buderus RoomTemporaryDesiredTemp 16 in die Befehlszeile eingebe kommt 16 und im eventmonitor steht
2018-10-17 17:09:15 BDKM Buderus RoomTemporaryDesiredTemp: 16
also ohne Fehler anscheinend...
Gut meine Idee war offenbar verkehrt - das Gerät kann offenbar das was Du willst. Geht denn der Befehl so wie er ist in der FHEm Kommandozeile?
Gruß Otto
Zitat von: Otto123 am 17 Oktober 2018, 17:14:55
Geht denn der Befehl so wie er ist in der FHEm Kommandozeile?
Gruß Otto
Siehe mein edit
Zitat von: Tabularasa am 17 Oktober 2018, 17:05:46
Wenn ich set Buderus RoomTemporaryDesiredTemp 16 in die Befehlszeile eingebe kommt 16 und im eventmonitor steht
2018-10-17 17:09:15 BDKM Buderus RoomTemporaryDesiredTemp: 16
also ohne Fehler anscheinend...
Befehlszeile=Kommandozeile
Würde ich das in die Kommandozeile eingeben?
ZitatBesonderheit des Error-Reading
Das Reading "error" enthält Fehlermeldungen oder Rückgabewerte von Befehlen, die nicht 0, "", undef. also logisch "falsch" entsprechen. Die Ausführung des Befehls
({my $var = 1})
setzt das Error-Reading
error {my $var =1 }: 1
Diese falsche Fehlermeldung kann vermieden werden, durch Erzeugen eines Rückgabewertes, der logisch "falsch" entspricht.
({my $var = 1;; 0})
Die mit ";; 0" angehängte Null verhindert das Setzen des Error-Readings.
und wie kann ich das rückgängig machen falls es dadurch nicht weg ist? Bzw hat das nur auf dieses DOIF Auswirkungen?
Uih, da hab ich keine Idee. Du kannst Spasseshalber ein notify machen :)
define n_Heizung notify Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}
Kann aber sein, der Event stimmt so noch nicht.
Gruß Otto
Die Beispiele im Wiki sollen nur erläutern, wie der falsche Fehler zu Stande kommt und dass er bei Rückgabe von logisch 0 vermieden wird.
In Deinem Fall müsstest Du set mit der Funktion fhem aufrufen.
(Bedingung) {fhem("set Buderus RoomTemporaryDesiredTemp 17");;undef}
Ggf. kanst Du ein Semikolon weglassen.
Zitat von: Otto123 am 17 Oktober 2018, 18:11:59
Uih, da hab ich keine Idee. Du kannst Spasseshalber ein notify machen :)
define n_Heizung Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}
Kann aber sein, der Event stimmt so noch nicht.
Gruß Otto
Auch wenn es noch nicht so aussieht, ich glaube mit DOIF komme ich besser klar ;D aber danke
Zitat von: Ellert am 17 Oktober 2018, 18:54:01
Die Beispiele im Wiki sollen nur erläutern, wie der falsche Fehler zu Stande kommt und dass er bei Rückgabe von logisch 0 vermieden wird.
In Deinem Fall müsstest Du set mit der Funktion fhem aufrufen.
(Bedingung) {fhem("set Buderus RoomTemporaryDesiredTemp 17");;undef}
Ggf. kanst Du ein Semikolon weglassen.
OK danke probiere ich morgen gleich aus
Perl-Modus dürfte unempfindlicher sein:
DOIF {if ([$SELF:warm]) {fhem_set"Buderus RoomTemporaryDesiredTemp 17"}}
attr DOIF_Reading warm:[Buderus:OutdoorTemp]>15
ZitatAuch wenn es noch nicht so aussieht, ich glaube mit DOIF komme ich besser klar ;D aber danke
Stimmt: DOIF kann zwar nicht immer mit FHEM Befehlen umgehen - aber der letzte Vorschlag erscheint so viel verständlicher als ein simples notify. :-\ :-[ :'(
Edit: Sorry da fehlte was Entscheidendes:
define n_Heizung notify Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}
Warum traust Du dich nicht zu Copy & Paste ? Ich habe es extra probiert, das klappt schon so ;)
Zitat von: Otto123 am 17 Oktober 2018, 21:05:47
Stimmt: DOIF kann zwar nicht immer mit FHEM Befehlen umgehen - aber der letzte Vorschlag erscheint so viel verständlicher als ein simples notify. :-\ :-[ :'(
Warum traust Du dich nicht zu Copy & Paste ? Ich habe es extra probiert, das klappt schon so ;)
Dann rate mal, warum ich DOIF_Readings ins Spiel gebracht habe. Als Tipp: Notify leistet nicht das Gewünschte in deiner Definition ;)
hier noch mal etwas zu DOIF_Readings: https://forum.fhem.de/index.php/topic,84969.msg847033.html#msg847033
Zitat von: Otto123 am 17 Oktober 2018, 21:05:47
Stimmt: DOIF kann zwar nicht immer mit FHEM Befehlen umgehen - aber der letzte Vorschlag erscheint so viel verständlicher als ein simples notify. :-\ :-[ :'(
Edit: Sorry da fehlte was Entscheidendes:
define n_Heizung notify Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}
Warum traust Du dich nicht zu Copy & Paste ? Ich habe es extra probiert, das klappt schon so ;)
Das DOIF war so nicht ganz vollständig. Sondern so
([Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45 and [07:00-22:00]) (set RoomTemporaryDesiredTemp 17)
DOELSEIF (Bedingung) (set RoomTemporaryDesiredTemp 15)
DOELSE (set RoomTemporaryDesiredTemp -1)
Wie würde das notify denn da aussehen? Ich habe davon leider keine Ahnung...
Ich probiere aber die DOIF Variannten von @Ellert und @Damian aber mal aus. Wie würde denn da das DOIF in Perl aussehen? So ungefähr??
{if ([$SELF:warm] and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45 and [07:00-22:00]) {fhem_set"Buderus RoomTemporaryDesiredTemp 17"}}
Elseif (Bedingung) {fhem_set ""}
Elseif {fhem_set"Buderus RoomTemporaryDesiredTemp -1"}
Zitat von: Tabularasa am 19 Oktober 2018, 15:55:43
Wie würde das notify denn da aussehen? Ich habe davon leider keine Ahnung...
Das Schwarze ist die Schrift? Die weiße Zeile mit Code: davor und Inhalt in meinem Post? :-\Sorry, hab nicht alles gelesen ...
Zitat von: Otto123 am 19 Oktober 2018, 16:36:29
Das Schwarze ist die Schrift? Die weiße Zeile mit Code: davor und Inhalt in meinem Post? :-\
Jetzt steh ich ganz auf dem Schlauch :-[
dein notify
define n_Heizung notify Buderus:OutdoorTemp.* { if ($EVTPART1 > 15) {fhem("set Buderus RoomTemporaryDesiredTemp 17")}}
entspricht doch nicht dem kompletten DOIF von mir oder wie?
Das DOIF aus deinem ersten Post macht doch nichts anderes? Oder redest Du von einem Anderen?
In #13 hatte ich ja geschrieben, dass mein DOIF vom ersten Post nicht vollständig war sondern
([Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45 and [07:00-22:00]) (set RoomTemporaryDesiredTemp 17)
DOELSEIF (Bedingung) (set RoomTemporaryDesiredTemp 15)
DOELSE (set RoomTemporaryDesiredTemp -1)
und
ZitatWie würde das notify denn da aussehen? Ich habe davon leider keine Ahnung...
dieser Text von mir stand ja direkt unter dem vollständigen DOIF und bezog sich darauf :D[
Naja, das liebe ich: Immer bloß die Hälfte posten :)
Kann es sein, dass dein Edit und mein Post sich überschnitten haben? Oder ich habe einfach nicht alles gelesen :-[
Naja mit drei zusätzlichen Bedingungen und Zeitraum wird das notify natürlich komplizierter.
Machs mit DOIF :)
Gruß Otto
;D ;D
aber mein edit hatte nur Kleinigkeiten geändert... der Hauptteil war schon da ;)
Nur wie es aussieht muss ich ja das DOIF auch mit Perl machen, da ja sonst der error immer kommt aber da muss ich wohl auf Damian oder Ellert warten ob mein Versuch aus #13 zumindest im Ansatz richtig war 8)
Zitat von: Tabularasa am 19 Oktober 2018, 19:43:35
;D ;D
aber mein edit hatte nur Kleinigkeiten geändert... der Hauptteil war schon da ;)
Nur wie es aussieht muss ich ja das DOIF auch mit Perl machen, da ja sonst der error immer kommt aber da muss ich wohl auf Damian oder Ellert warten ob mein Versuch aus #13 zumindest im Ansatz richtig war 8)
DOIF
{ if ([$SELF:temp] and [07:00-22:00]) {
fhem_set "Buderus RoomTemporaryDesiredTemp 17"
} else {
fhem_set "Buderus RoomTemporaryDesiredTemp -1"
}
}
attr DOIF_Readings temp: ([Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45)
DOIF_Readings entkoppelt wiederholende Events von der eigentlichen DOIF-Definition, damit nicht bei jedem Event geschaltet wird.
Danke erstmal. Ich hoffe ich hab das jetzt richtig verstanden... Im nachfolgenden Code ist noch ein zusätzlicher Zweig. @Damian, kannst du nochmal drüber gucken, auch mit Klammersetzung?Das Fettgeschriebene ist jetzt nur erstmal zum Verständnis, noch kein richtiger Zweck.
DOIF
{ if ([$SELF:temp] and [07:00-22:00]) {
fhem_set "Buderus RoomTemporaryDesiredTemp 17"
} [b]elsif {
([$SELF:absent] and [07:00-22:00]) {
fhem_set "Buderus RoomTemporaryDesiredTemp 16"[/b]
}
else {
fhem_set "Buderus RoomTemporaryDesiredTemp -1"
}
}
attr DOIF_Readings temp: ([Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45)[b], absent: ([Bewohner] eq "absent" and [Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<45 and [HZG_EG_EZ:actuator]<20)[/b]
Zitat von: Tabularasa am 19 Oktober 2018, 21:24:32
Danke erstmal. Ich hoffe ich hab das jetzt richtig verstanden... Im nachfolgenden Code ist noch ein zusätzlicher Zweig. @Damian, kannst du nochmal drüber gucken, auch mit Klammersetzung?Das Fettgeschriebene ist jetzt nur erstmal zum Verständnis, noch kein richtiger Zweck.
DOIF
{ if ([$SELF:temp] and [07:00-22:00]) {
fhem_set "Buderus RoomTemporaryDesiredTemp 17"
} [b]elsif {
([$SELF:absent] and [07:00-22:00]) {
fhem_set "Buderus RoomTemporaryDesiredTemp 16"[/b]
}
else {
fhem_set "Buderus RoomTemporaryDesiredTemp -1"
}
}
attr DOIF_Readings temp: ([Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<65 and [HZG_EG_EZ:actuator]<45)[b], absent: ([Bewohner] eq "absent" and [Buderus:OutdoorTemp]>15 and [HZG_EG_WZ:actuator]<45 and [HZG_EG_EZ:actuator]<20)[/b]
Im ersten if-Zweig kommt absent nicht vor, d. h. auch wenn der zweite wahr wird, wird paar Minuten später evtl. der erste wieder zuschlagen,
unabhängig davon ob absent wahr ist oder nicht.
Hallo. Ich habe mein DOIF jetzt nochmal geändert, da ich glaube dass es mit der Außentemperatur nicht funktioniert, jedoch schaltet das aktuelle nicht. Hier mal das list
Internals:
DEF { if ([$SELF:power]) {
fhem_set "Buderus RoomTemporaryDesiredTemp 5"
} elsif
([$SELF:act]) {
fhem_set "Buderus RoomTemporaryDesiredTemp -1"
}
}
MODEL Perl
NAME di_Heizung
NR 217
NTFY_ORDER 50-di_Heizung
STATE cmd_1
TYPE DOIF
DOIF_Readings:
act (::EventDoIf('',$hash,'^actuator',0)>55)
power (::ReadingValDoIf($hash,'Buderus','Power')==0)
READINGS:
2018-10-25 20:38:19 Device di_Heizung
2018-10-25 20:15:29 act
2018-10-25 20:38:19 cmd 1
2018-10-25 20:38:19 cmd_event set_cmd_1
2018-10-25 20:38:19 cmd_nr 1
2018-10-25 20:34:06 mode enabled
2018-10-25 19:58:53 power 1
2018-10-25 20:38:19 state cmd_1
2018-10-19 23:08:38 temp
2018-10-19 15:41:50 warm
Regex:
DOIF_Readings:
:
act:
":^actuator" :^actuator
Buderus:
power:
Power ^Buderus$:^Power:
di_Heizung:
attr:
cmdState:
condition:
0 if (::ReadingValDoIf($hash,'di_Heizung','power')) {
fhem_set "Buderus RoomTemporaryDesiredTemp 5"
} elsif
(::ReadingValDoIf($hash,'di_Heizung','act')) {
fhem_set "Buderus RoomTemporaryDesiredTemp -1"
}
devices:
0 di_Heizung
all di_Heizung
do:
0:
helper:
event cmd_nr: 1,cmd: 1,cmd_event: set_cmd_1,cmd_1
globalinit 1
last_timer 0
sleeptimer -1
triggerDev di_Heizung
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: set_cmd_1
state: cmd_1
triggerEvents:
cmd_nr: 1
cmd: 1
cmd_event: set_cmd_1
cmd_1
Device: di_Heizung
triggerEventsState:
cmd_nr: 1
cmd: 1
cmd_event: set_cmd_1
state: cmd_1
internals:
itimer:
perlblock:
0
readings:
0 di_Heizung:power di_Heizung:act
all di_Heizung:power di_Heizung:act
trigger:
uiState:
uiTable:
Attributes:
DOIF_Readings power:([Buderus:Power]==0), act:([":^actuator"]>55)
room DOIF
Es soll, wenn irgendein Thermostat die Actuator Position über 55 hat, in cmd_2 wechseln. Das tut es aber nicht.
Und warum kann ich eigentlich bei set nur noch enable und disable auswählen? Danke
Du hast scheinbar im FHEM-Modus angefangen und dann in Perl gewechselt. Die ganzen cmd-Readings gibt es im Perl-Modus normalerweise nicht.
Hast du die cfg-Datei editiert?
Es stand die ganze Zeit auf cmd_2 und dann habe ich in der Kommandozeile set di_Heizung cmd_1
eingegeben.
Deshalb vielleicht die cmd Readings... cfg habe ich nicht editiert. Sonst würde es aber gut aussehen? Bzw wie wechselt man denn in den Perl Modus?
Zitat von: Tabularasa am 25 Oktober 2018, 22:13:50
Es stand die ganze Zeit auf cmd_2 und dann habe ich in der Kommandozeile set di_Heizung cmd_1
eingegeben.
Deshalb vielleicht die cmd Readings... cfg habe ich nicht editiert. Sonst würde es aber gut aussehen? Bzw wie wechselt man denn in den Perl Modus?
Ich weiß nicht, ob dir der Unterschied zwischen FHEM-Modus und Perl-Modus bewusst ist. Deine Definition ist aufgrund der Syntax Perlmodus, es beginnt mit { statt mit (, da solltest du noch mal in der Commandref nachschauen. Im Perl-Modus gibt es keine Zustände und keine cmd-Kommandos, daher eine eingeschränkte Auswahl von set-Befehlen. Wenn dir das zu ungewohnt ist, dann bleibe im FHEM-Modus.
Das ist mir durchaus ungewohnt und ich würde auch gern im fhem Modus bleiben, jedoch bekomme ich ja dann wieder den Error. Der erste Zweig hat heute morgen zumindest schonmal funktioniert. Ich denke es liegt irgendwo an dem DOIF_Reading mit act. Ist das die richtige Syntax dafür um auf alle devices die im Reading actuator haben zu prüfen? Wäre schön wenn du dir das nochmal ansehen könntest. Danke
edit: habe das DOIF mal gelöscht und neu angelegt. im Log kommt
2018.10.26 09:57:14 3: di_Heizung: warning in DOIF_Readings: act
hier nochmal ein list
Internals:
CFGFN
DEF { if ([$SELF:power]) {
fhem_set "Buderus RoomTemporaryDesiredTemp 5" }
elsif ([$SELF:act]) {
fhem_set "Buderus RoomTemporaryDesiredTemp -1" }
}
MODEL Perl
NAME di_Heizung
NR 3703
NTFY_ORDER 50-di_Heizung
STATE ???
TYPE DOIF
DOIF_Readings:
act (::EventDoIf('',$hash,'^actuator',0)>55)
power (::ReadingValDoIf($hash,'Buderus','Power')==0 and ::ReadingValDoIf($hash,'Buderus','PumpModulation')<46)
READINGS:
2018-10-26 09:57:14 Device di_Heizung
2018-10-26 09:57:14 act
2018-10-26 09:57:16 block_01 executed
2018-10-26 09:57:14 e_di_Heizung_act
2018-10-26 09:57:14 e_di_Heizung_power 1
2018-10-26 09:56:46 mode enabled
2018-10-26 09:57:14 power 1
Regex:
DOIF_Readings:
:
act:
":^actuator" :^actuator
power:
Buderus:
act:
power:
Power ^Buderus$:^Power:
PumpModulation ^Buderus$:^PumpModulation:
condition:
0 if (::ReadingValDoIf($hash,'di_Heizung','power')) {
fhem_set "Buderus RoomTemporaryDesiredTemp 5" }
elsif (::ReadingValDoIf($hash,'di_Heizung','act')) {
fhem_set "Buderus RoomTemporaryDesiredTemp -1" }
devices:
0 di_Heizung
all di_Heizung
helper:
DOIF_Readings_events
event power: 1,act:
globalinit 1
last_timer 0
sleeptimer -1
triggerDev di_Heizung
triggerEvents:
power: 1
act:
e_di_Heizung_power: 1
triggerEventsState:
power: 1
act:
internals:
itimer:
perlblock:
0
readings:
0 di_Heizung:power di_Heizung:act
all di_Heizung:power di_Heizung:act
trigger:
uiState:
uiTable:
Attributes:
DOIF_Readings power:([Buderus:Power]==0 and [Buderus:PumpModulation]<46), act:([":^actuator"]>55)
room DOIF
ZitatDEF { if ([$SELF:power]) {
fhem_set "Buderus RoomTemporaryDesiredTemp 5"
} elsif
([$SELF:act]) {
fhem_set "Buderus RoomTemporaryDesiredTemp -1"
}
}
Der Perlmodus verhält sich anders, als der FHEM-Modus, hier wird immer der ganze Block ausgeführt (entspricht checkall). Wenn
act triggert und
power wahr ist, dann wird immer nur der erste Zweig ausgeführt, bis zu der zweiten Abfrage kommt es dann nicht mehr.
Wenn die Bedingungen unabhängig von einander sind, dann sollte man sie in eigenen Blöcken unterbringen.
DEF
{ if ([$SELF:power]) {fhem_set "Buderus RoomTemporaryDesiredTemp 5"}}
{ if ([$SELF:act]) {fhem_set "Buderus RoomTemporaryDesiredTemp -1"}}
So sind die Abfragen entkoppelt und beeinflussen sich nicht.
Hier mal ein list im FHEM Modus nach Ellert seiner Anleitung(falls ich es richtig gemacht habe), der leider auch nicht klappt
Internals:
CFGFN
DEF ([Buderus:Power]==0 and [Buderus:PumpModulation]<46)
{fhem("set Buderus:FILTER=RoomTemporaryDesiredTemp!=5 RoomTemporaryDesiredTemp 5");;undef}
DOELSEIF
([":^actuator"]>55) {fhem("set Buderus RoomTemporaryDesiredTemp 20");;undef}
MODEL FHEM
NAME di_Heizung1
NR 3533
NTFY_ORDER 50-di_Heizung1
STATE cmd_1
TYPE DOIF
READINGS:
2018-10-26 10:29:44 Device HZG_OG_Nora
2018-10-26 10:28:30 cmd 1
2018-10-26 10:28:30 cmd_event di_Heizung1
2018-10-26 10:28:30 cmd_nr 1
2018-10-26 10:28:24 mode enabled
2018-10-26 10:28:30 state cmd_1
Regex:
cond:
:
0:
1:
":^actuator" :^actuator
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Buderus','Power')==0 and ::ReadingValDoIf($hash,'Buderus','PumpModulation')<46
1 ::EventDoIf('',$hash,'^actuator',0)>55
devices:
0 Buderus
all Buderus
do:
0:
0 {fhem("set Buderus:FILTER=RoomTemporaryDesiredTemp!=5 RoomTemporaryDesiredTemp 5");;undef}
1:
0 {fhem("set Buderus RoomTemporaryDesiredTemp 20");;undef}
2:
helper:
event actuator: 71
globalinit 1
last_timer 0
sleeptimer -1
timerdev
timerevent
timerevents
timereventsState
triggerDev HZG_OG_Nora
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: di_Heizung1
state: cmd_1
triggerEvents:
actuator: 71
triggerEventsState:
actuator: 71
internals:
itimer:
readings:
0 Buderus:Power Buderus:PumpModulation
all Buderus:Power Buderus:PumpModulation
trigger:
uiState:
uiTable:
Attributes:
room DOIF
Leider klappt das mit den eigenen Blöcken auch nicht :-\
hatte auch ein edit im letzten Beitrag. haste den gesehen?
hier mal noch was kommt im eventmonitor
2018-10-26 10:47:02 CUL_HM HZG_OG_Nora actuator: 74
2018-10-26 10:52:52 CUL_HM HZG_OG_Nora actuator: 97
und hier dazu im log
2018.10.26 10:47:02 3: di_Heizung: warning in DOIF_Readings: act
2018.10.26 10:52:52 3: di_Heizung: warning in DOIF_Readings: act
In beiden Fällen hast du so etwas eingebaut:
[":^actuator"]>55
Die Ereignisabfrage liefert nur wahr oder falsch aber keinen Wert.
Solche Verallgemeinerungen funktionieren nicht gut, denn auch wenn es funktionieren würde, wenn irgend ein actuator > 55 meldet und der nächste < 55, ist der vorherige vermutlich immer noch > 55. Da musst du dir etwas anderes überlegen.
Zitat von: Damian am 26 Oktober 2018, 11:21:56
In beiden Fällen hast du so etwas eingebaut:
[":^actuator"]>55
Die Ereignisabfrage liefert nur wahr oder falsch aber keinen Wert.
Ah ok, das erklärt es dann schon einigermaßen
Zitat von: Damian am 26 Oktober 2018, 11:21:56
auch wenn es funktionieren würde, wenn irgend ein actuator > 55 meldet und der nächste < 55, ist der vorherige vermutlich immer noch > 55. Da musst du dir etwas anderes überlegen.
das ist eigentlich auch so gewollt, denn wenn einer noch über >55 liegt ist es nicht warm genug und soll weiter geheizt werden. Kann man nicht auf wahr triggern und so den Zweig auslösen? Wäre meine Lieblingslösung ;D
Eine andere Idee hätte ich noch aber da weiß ich nicht wie ich das hin bekomme und ob es auch so zulässig funktioniert... Also den Durchschnitt aus allen 6 actuator Stellungen bilden und dann > zB 55. Ist das möglich? Aslo zB
DOIF_Readings power:([Buderus:Power]==0 and [Buderus:PumpModulation]<46), act:((([EZ:actuator]+[WZ:actuator]+[EZ1:actuator]+[WZ1:actuator]+[EZ2:actuator]+[WZ2:actuator])/6)>55)
Ginge das? Kann ich vor act in den DOIF_Reading ENTER drücken, also ein Zeilenumbruch machen oder muss das so in einer Zeile stehen?
Zitat von: Tabularasa am 26 Oktober 2018, 11:56:07
Ah ok, das erklärt es dann schon einigermaßendas ist eigentlich auch so gewollt, denn wenn einer noch über >55 liegt ist es nicht warm genug und soll weiter geheizt werden. Kann man nicht auf wahr triggern und so den Zweig auslösen? Wäre meine Lieblingslösung ;D
Eine andere Idee hätte ich noch aber da weiß ich nicht wie ich das hin bekomme und ob es auch so zulässig funktioniert... Also den Durchschnitt aus allen 6 actuator Stellungen bilden und dann > zB 55. Ist das möglich? Aslo zB
DOIF_Readings power:([Buderus:Power]==0 and [Buderus:PumpModulation]<46), act:((([EZ:actuator]+[WZ:actuator]+[EZ1:actuator]+[WZ1:actuator]+[EZ2:actuator]+[WZ2:actuator])/6)>55)
Ginge das?
Das ist trotzdem zu kurzsichtig und der Informationsgehalt geht gegen Null, denn wenn einer >55 meldet und paar Minuten später <55, dann könnte es der selbe sein oder auch ein anderer.
Das kann man elegant mit Aggregationsfunktionen lösen siehe: https://fhem.de/commandref_DE.html#DOIF_aggregation
Dort sind einige Beispiele, die du auf deine Bedürfnisse anpassen kannst.
Alles klar. Danke. Ich werde mich mal dran versuchen und melde mich mit einer Lösung oder Frage ;D