Perl Modus, fhem_set für mehrere set Befehle

Begonnen von Rewe2000, 21 April 2025, 12:06:04

Vorheriges Thema - Nächstes Thema

Rewe2000

Hallo,

gibt es die Möglichkeit in einem Doif im Perl Modus, mehrere set Befehle über "fhem_set" nacheinander abzusetzen, ohne immer das "fhem_set" mehrmals zu verwenden?
Mein Testbaustein sieht aktuell wie folgt aus:
[code]define di_Test DOIF {\
if ([$SELF:Betriebsart] eq "Aus") {\
fhem_set("du_Test Out_1 aus");; fhem_set("du_Test Out_2 aus");; fhem_set("du_Test Out_3 aus");; fhem_set("du_Test Out_4 aus")\
}\
elsif ([$SELF:Betriebsart] eq "Gebläsestufe_1") {\
fhem_set("du_Test Out_1 ein");; fhem_set("du_Test Out_2 aus");; fhem_set("du_Test Out_3 aus");; fhem_set("du_Test Out_4 aus")\
}\
elsif ([$SELF:Betriebsart] eq "Gebläsestufe_2") {\
fhem_set("du_Test Out_1 aus");; fhem_set("du_Test Out_2 ein");; fhem_set("du_Test Out_3 aus");; fhem_set("du_Test Out_4 aus")\
}\
elsif ([$SELF:Betriebsart] eq "Gebläsestufe_3") {\
fhem_set("du_Test Out_1 aus");; fhem_set("du_Test Out_2 aus");; fhem_set("du_Test Out_3 ein");; fhem_set("du_Test Out_4 aus")\
}\
elsif ([$SELF:Betriebsart] eq "Gebläsestufe_4") {\
fhem_set("du_Test Out_1 ein");; fhem_set("du_Test Out_2 ein");; fhem_set("du_Test Out_3 aus");; fhem_set("du_Test Out_4 aus")\
}\
elsif ([$SELF:Betriebsart] eq "Gebläsestufe_5") {\
fhem_set("du_Test Out_1 ein");; fhem_set("du_Test Out_2 aus");; fhem_set("du_Test Out_3 ein");; fhem_set("du_Test Out_4 aus")\
}\
elsif ([$SELF:Betriebsart] eq "Auto") {\
fhem_set("du_Test Out_1 aus");; fhem_set("du_Test Out_2 ein");; fhem_set("du_Test Out_3 ein");; fhem_set("du_Test Out_4 aus")\
}\
elsif ([$SELF:Betriebsart] eq "Badsteuerung") {\
fhem_set("du_Test Out_1 aus");; fhem_set("du_Test Out_2 aus");; fhem_set("du_Test Out_3 aus");; fhem_set("du_Test Out_4 ein")\
}\
elsif ([$SELF:Betriebsart] eq "Nachtlüftung") {\
fhem_set("du_Test Out_1 aus");; fhem_set("du_Test Out_2 aus");; fhem_set("du_Test Out_3 ein");; fhem_set("du_Test Out_4 ein")\
}\
}
attr di_Test DbLogExclude .*
attr di_Test readingList Betriebsart
attr di_Test setList Betriebsart:Aus,Gebläsestufe_1,Gebläsestufe_2,Gebläsestufe_3,Gebläsestufe_4,Gebläsestufe_5,Auto,Badsteuerung,Nachtlüftung
#   DEF        {
# if ([$SELF:Betriebsart] eq "Aus") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 aus")
# }
# elsif ([$SELF:Betriebsart] eq "Gebläsestufe_1") {
# fhem_set("du_Test Out_1 ein"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 aus")
# }
# elsif ([$SELF:Betriebsart] eq "Gebläsestufe_2") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 ein"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 aus")
# }
# elsif ([$SELF:Betriebsart] eq "Gebläsestufe_3") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 ein"); fhem_set("du_Test Out_4 aus")
# }
# elsif ([$SELF:Betriebsart] eq "Gebläsestufe_4") {
# fhem_set("du_Test Out_1 ein"); fhem_set("du_Test Out_2 ein"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 aus")
# }
# elsif ([$SELF:Betriebsart] eq "Gebläsestufe_5") {
# fhem_set("du_Test Out_1 ein"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 ein"); fhem_set("du_Test Out_4 aus")
# }
# elsif ([$SELF:Betriebsart] eq "Auto") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 ein"); fhem_set("du_Test Out_3 ein"); fhem_set("du_Test Out_4 aus")
# }
# elsif ([$SELF:Betriebsart] eq "Badsteuerung") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 ein")
# }
# elsif ([$SELF:Betriebsart] eq "Nachtlüftung") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 ein"); fhem_set("du_Test Out_4 ein")
# }
#}
#   FUUID      67e91a66-f33f-7df9-5a62-4828a718cf411594
#   MODEL      Perl
#   NAME       di_Test
#   NOTIFYDEV  global,di_Test
#   NR         597
#   NTFY_ORDER 50-di_Test
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    29460 2024-12-29 20:25:48
#   eventCount 62
#   OLDREADINGS:
#   READINGS:
#     2025-04-21 11:44:58   Betriebsart     Aus
#     2025-04-21 11:44:58   block_01        executed
#     2025-04-21 11:44:58   e_di_Test_Betriebsart Aus
#     2025-04-21 11:43:27   mode            enabled
#     2025-04-21 11:43:27   state           initialized
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       di_Test:
#         0:
#           Betriebsart ^di_Test$:^Betriebsart:
#   condition:
#     0         
# if (::ReadingValDoIf($hash,'di_Test','Betriebsart') eq "Aus") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 aus")
# }
# elsif (::ReadingValDoIf($hash,'di_Test','Betriebsart') eq "Gebläsestufe_1") {
# fhem_set("du_Test Out_1 ein"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 aus")
# }
# elsif (::ReadingValDoIf($hash,'di_Test','Betriebsart') eq "Gebläsestufe_2") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 ein"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 aus")
# }
# elsif (::ReadingValDoIf($hash,'di_Test','Betriebsart') eq "Gebläsestufe_3") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 ein"); fhem_set("du_Test Out_4 aus")
# }
# elsif (::ReadingValDoIf($hash,'di_Test','Betriebsart') eq "Gebläsestufe_4") {
# fhem_set("du_Test Out_1 ein"); fhem_set("du_Test Out_2 ein"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 aus")
# }
# elsif (::ReadingValDoIf($hash,'di_Test','Betriebsart') eq "Gebläsestufe_5") {
# fhem_set("du_Test Out_1 ein"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 ein"); fhem_set("du_Test Out_4 aus")
# }
# elsif (::ReadingValDoIf($hash,'di_Test','Betriebsart') eq "Auto") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 ein"); fhem_set("du_Test Out_3 ein"); fhem_set("du_Test Out_4 aus")
# }
# elsif (::ReadingValDoIf($hash,'di_Test','Betriebsart') eq "Badsteuerung") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 aus"); fhem_set("du_Test Out_4 ein")
# }
# elsif (::ReadingValDoIf($hash,'di_Test','Betriebsart') eq "Nachtlüftung") {
# fhem_set("du_Test Out_1 aus"); fhem_set("du_Test Out_2 aus"); fhem_set("du_Test Out_3 ein"); fhem_set("du_Test Out_4 ein")
# }
#
#   helper:
#     NOTIFYDEV  global,di_Test
#     event      Betriebsart: Aus
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#     triggerDev di_Test
#     triggerEvents:
#       Betriebsart: Aus
#       e_di_Test_Betriebsart: Aus
#       block_01: executed
#     triggerEventsState:
#       Betriebsart: Aus
#       e_di_Test_Betriebsart: Aus
#       block_01: executed
#   hmccu:
#   internals:
#   perlblock:
#     0          block_01
#   readings:
#     all         di_Test:Betriebsart
#   trigger:
#   uiState:
#   uiTable:
#
setstate di_Test initialized
setstate di_Test 2025-04-21 11:44:58 Betriebsart Aus
setstate di_Test 2025-04-21 11:44:58 block_01 executed
setstate di_Test 2025-04-21 11:44:58 e_di_Test_Betriebsart Aus
setstate di_Test 2025-04-21 11:43:27 mode enabled
setstate di_Test 2025-04-21 11:43:27 state initialized

[/code]

Mein Doif macht ja das was es soll, aber ich würde mir da gerne noch einige fhem_set Befehle sparen.
Ich habe schon alle Schreibweisen und Verdoppelungen durch, leider ohne Erfolg.

Hintergrund:
Aktuell schreibe ich die set-Befehle noch an ein Dummy Device, später will ich hier ein HmIP-MOD-OC8 Device ansteuern, dieses wiederum steuert dann einen WRG-Lüfter über eine Digitalmatrix an.

Über Tipps würde ich mich freuen.
Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Per

Du könntest mit Array und for each arbeiten.

Damian

Um den vollen Funktionsnumfang des FHEM-set-Befehls zu nutzen, musst du über fhem"set..." gehen. Hier kannst du z. B. regex oder kommagetrennt Devices angeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rewe2000

#3
Hallo,

vielen Dank für eure Antworten.

Zitat von: Damian am 22 April 2025, 08:30:19Um den vollen Funktionsnumfang des FHEM-set-Befehls zu nutzen, musst du über fhem"set..." gehen. Hier kannst du z. B. regex oder kommagetrennt Devices angeben.

Irgendwie stell ich mich da einfach zu blöd an, mir gelingt es nicht die Readings in den vorhandenen Devices direkt zu setzen. Da ich ja im set Befehl den Devicenamen und das Reading angeben muss, klappt das mit der Adressierung bei mir nicht.

Funktioniert perfekt:
{fhem("set du_Test1,du_Test2 on")}
Funktioniert nicht:
{fhem("set du_Test1 Out_1,du_Test1 Out_2 on")}
Auch Versuche mit einfachen und doppelten Semikolon oder zusätzliche '' oder "" bei den einzelnen Device Befehlen funktionieren nicht.

Wie lautet hier die korrekte Schreibweise des set-Befehls, oder geht das so überhaupt nicht?
Könnt ihr mir da bitte auf die Sprünge helfen.

Gruß Reinhard

Edit!
Die Readings im dummy-Device können von extern beschrieben werden, Attribut readingList wurde im Device gesetzt.
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

Damian

Wenn du nur Readings setzen willst, dann würde ich setreading-Befehl verwenden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

TomLee

ZitatAuch Versuche mit einfachen und doppelten Semikolon oder zusätzliche '' oder "" bei den einzelnen Device Befehlen funktionieren nicht.

Hallo,

irgendwas musst dabei falsch gemacht haben. Perl ist Perl, unabhängig davon das man die "normale" fhem-Funktion in einer DOIF-Definition aufruft. Mein Verständnis.

Frag mich aber nicht wo die Beschreibung der Syntax in der commandref zu finden ist. Ich orientiere mich immer an den Beispielen im notify-Wiki

https://demo-fhem.cooltux.net/fhem?room=Rewe2000

defmod di_Test DOIF {\
if ([$SELF:Betriebsart] eq "Aus") {\
fhem("set du_Test Out_1 aus;;set du_Test Out_2 aus;;set du_Test Out_3 aus;;set du_Test Out_4 aus")}\
elsif ([$SELF:Betriebsart] eq "Gebläsestufe_1") {\
fhem("set du_Test Out_1 ein;;set du_Test Out_2 aus;;set du_Test Out_3 aus;;set du_Test Out_4 aus")}\
}
attr di_Test readingList Betriebsart
attr di_Test room Rewe2000
attr di_Test setList Betriebsart:Aus,Gebläsestufe_1

setstate di_Test initialized
setstate di_Test 2025-04-23 22:47:43 Betriebsart Aus
setstate di_Test 2025-04-23 22:47:43 block_01 executed
setstate di_Test 2025-04-23 22:47:43 e_di_Test_Betriebsart Aus
setstate di_Test 2025-04-23 22:44:19 mode enabled
setstate di_Test 2025-04-23 22:44:19 state initialized

defmod du_Test dummy
attr du_Test readingList Out_1 Out_2 Out_3 Out_4
attr du_Test room Rewe2000
attr du_Test setList Out_1:on,off Out_2:on,off Out_3:on,off Out_4:on,off

setstate du_Test 2025-04-23 22:47:43 Out_1 aus
setstate du_Test 2025-04-23 22:47:43 Out_2 aus
setstate du_Test 2025-04-23 22:47:43 Out_3 aus
setstate du_Test 2025-04-23 22:47:43 Out_4 aus

Gruß Thomas


Rewe2000

Hallo Thomas,

danke für deine Mühe mit den Testprogrammen.
Das war mir schon klar, dass ich mehrere set-Befehle, mit Semikolon (ggf. mit Escapen) hintereinander schreiben kann.
Ich habe mich an folgender Syntax versucht, was aber anscheinend so, wegen der darin enthaltenen Readings nicht geht:
{ fhem("set du_Test Out_1,du_Test Out_2,du_Test Out_3,du_Test Out_4 aus")}Auch das Maskieren mit "" oder '' hat mir hier nicht geholfen, anscheinend ist hier das Leerzeichen zwischen Device und Reading das Problem.

Bei unterschiedlichen Device ohne Readings funktioniert:
{ fhem("set lamp1,lamp2,lamp3 on")}
Die Doku zu devspec enthält aber nur Beispiele mit Dummys, wo der state direkt (ohne Readings) gesetzt wird.
Fhem Doku zu set und devspec:
https://fhem.de/commandref_DE.html#devspec
Ich habe mir nun wie folgt geholfen:
Jeden Kanal meines HmIP-MOD-OC8 Device habe ich über HMCCUDEV in ein eigenes Device gepackt, somit kann ich diese direkt mit on oder off setzen (ohne Readings).
Aktuell verwende ich in meinem Doif zur Steuerung:
{fhem("set OG_Schlafzimmer_Lueftung_K1,OG_Schlafzimmer_Lueftung_K2 on;;set OG_Schlafzimmer_Lueftung_K3,OG_Schlafzimmer_Lueftung_K4 off")}Dies klappt soweit und damit kann ich aktuell leben.

Sollte es dennoch eine Schreibweise geben, in welcher ich auch ein Device mit Readings, mit einem set Befehl zusammen setzten kann würde mich das schon interessieren, denn irgendwann kommt der Fall wo man dies benötigt.

Nochmals Danke für deine Mühe.
Gruß Reinhard
Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky

TomLee

ZitatSollte es dennoch eine Schreibweise geben, in welcher ich auch ein Device mit Readings, mit einem set Befehl zusammen setzten kann würde mich das schon interessieren, denn irgendwann kommt der Fall wo man dies benötigt.

Verstehe ich erstmal nicht, der Beispiel-dummy hat doch setter zu jedem Reading.

Mich erinnert das ganze gerade an LightScene, das Modul würde einen setter für jeden if-Zweig ermöglichen.

Per

Hast du mal getestet, den String direkt in der Fhem Kommandozeile auszuführen? Wenn es da nicht geht, brauchst du es im DOIF nicht weiter zu probieren.

Rewe2000

Hallo,

@Thomas:
Meine Lüfter werden über eine 4-Kanal Matrix (digital) angesteuert, hierüber kann ich dann 9 Betriebsarten einstellen.
Da ich immer nur zwei Zustände (an/aus) bei den Readings setzen muss, wollte ich diese, wie in der Commandref unter devspec beschrieben gruppieren.
{ fhem("set du_Test Out_1,du_Test Out_2 ein;set du_Test Out_3,du_Test Out_4 aus")} ## Betriebsart Lüfterstufe 4
{ fhem("set du_Test Out_2,du_Test Out_3 ein;set du_Test Out_1,du_Test Out_4 aus")} ## Betriebsart Automatik
{ fhem("set du_Test Out_1,du_Test Out_2 aus;set du_Test Out_3,du_Test Out_4 ein")} ## Betriebsart Nachtlüftung

Damian hatte geschrieben, dass ein Gruppieren im Doif mit fhem_set() nicht möglich ist und mich auf fhem() verwiesen. Anscheinend geht dies aber bei Devices mit Readings nicht oder ich stelle mich nur zu blöd an.
Ich habe ja nun einen Weg gefunden (jeder Kanal ein Device), mit welchen ich leben kann und es ist für mich Übersichtlich und funktioniert gut.

@Per:
Es ist kein Doif Problem, ich teste immer in der Fhem Kommandozeile in {} (Perl).
Da ich unsprünglich fhem_set() verwenden wollte, habe ich diesen Beitrag im Doif Bereich geschrieben. Mittlerweile bin ich bei fhem() angekommen und deshalb ist die Diskussion auch hier in diesen Bereich OT, da im eigentlichen Sinn, nichts mehr mit Doif zu tun hat.

Ich dachte nur ich schreibe die Syntax falsch, weil es bei mir nicht klappt und wollte hier mal nachfragen.

Danke für eure Mühe
Gruß Reinhard


Fhem 6.3 auf Raspberry Pi4 SSD mit Raspbian Bookworm, Homematic, Homematic IP, CCU3 mit RapberryMatic, WAGO 750-880, E3DC S10E Hauskraftwerk, E3DC Wallbox, my-PV AC ELWA-E Heizstab, Fritz!Box 7590, KIA Bluelinky