FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: bstaeheli am 20 März 2025, 16:15:19

Titel: [gelöst] Perl-DOIFs können nicht mehr gespeichert werden
Beitrag von: bstaeheli am 20 März 2025, 16:15:19
Hallo zusammen

Ich habe ein komisches Verhalten mit Perl-DOIFs. Da ist ein sehr umfangreiches DOIF mit Templates zur "Treppenhauslichtsteuerung". Als ich im Template eine Zeile hinzufügen wollte, konnte ich den Editor nicht speichern. Keine Fehlermeldung, nichts. Interessant ist, dass ich auch das bestehende produktive DOIF nicht mehr anpassen/Änderungen vornehmen kann in der Definition. Es lädt aber beim FHEM-Start sauber und funktioniert.

Unten ist ein Listing einer gekürzten Version mit demselben Verhalten, reproduziert bei mir. Dieses DOIF funktioniert noch. Sobald ich aber die Zeile:
push (@{$_bm},["GSegBMEckeNOGSegLMHaus",            "GS.eg.BM.EckeNO",        "state",        "motion",    "GS.eg.LM.Haus",                            120,    2,            "on"]);hinzufügen möchte kommt das beschriebeneVerhalten.

Kann das bitte mal jemand versuchen zu reproduzieren?

FHEM ist auf dem aktuellsten Stand.

Funktionierendes DOIF:
define NN.xx.XX.Test2.di DOIF subs {\
## Ein Szenario wird durch Hinzufügen einer Definitionszeile erstellt, ACHTUNG nur alphanumerische und übers ganze DOIF eindeutige Schlüssel verwenden\
## TPL_BM, (Bewegung, lokale Helligkeit), ansonsten wie TPL_BG\
## Schlafen:  0 = nein, 1 = nur beim Schlafen, >1 = immer\
##             Key                                    EventDev                Reading            Value        Schalt-Device                                Timer    Schlafen    SetOnCmd\
push (@{$_bm},["EGflBMEGflSWLicht",                    "EG.fl.BM",                "occupancy",    "true",     "EG.fl.SW.Licht",                            120,    0,            "on"]);;\
push (@{$_bm},["EGflBMGSegLMHaus",                    "EG.fl.BM",                "occupancy",    "true",     "GS.eg.LM.Haus",                            120,    1,            "on"]);;\
\
\
push (@{$_bm},["EGflTKHaustuerGSegLMHaus",            "EG.fl.TK.Haustuer",    "state",        "open",        "GS.eg.LM.Haus",                            120,    2,            "on"]);;\
push (@{$_bm},["EGflTKHaustuerEGflSWLicht",            "EG.fl.TK.Haustuer",    "state",        "open",        "EG.fl.SW.Licht",                            120,    0,            "on"]);;\
\
push (@{$_bm},["EGgaTKTorEGgaLMDecke",                "EG.ga.TK.Garagentor",    "state",        "open",     "EG.ga.LM.Decke",                            300,    2,            "on"]);;\
\
push (@{$_bm},["EGkuWSKochinselEGkuLM",               "EG.ku.WS.Kochinsel_Motion","state",    "motion",     "EG.ku.XX.Licht.di",                        120,    0,            "warm"]);;\
push (@{$_bm},["EGkuWSKochinselEGkuLMAsleep",        "EG.ku.WS.Kochinsel_Motion","state",    "motion",     "EG.ku.XX.Licht.di",                        120,    1,            "night"]);;\
\
push (@{$_bm},["GSefDIHoftorGSegLMDeckeNW",            "GS.ef.DI.Hoftor",        "state",        "uncertain","GS.eg.LM.DeckeNW",                            300,    2,            "warm"]);;\
push (@{$_bm},["GSefDIHoftorGSegLMHaus",            "GS.ef.DI.Hoftor",        "state",        "uncertain","GS.eg.LM.Haus",                            300,    2,            "on"]);;\
}
attr NN.xx.XX.Test2.di readingList test
attr NN.xx.XX.Test2.di room DEV
attr NN.xx.XX.Test2.di setList test:slider,0,100,9000
#   DEF        subs {
### Ein Szenario wird durch Hinzufügen einer Definitionszeile erstellt, ACHTUNG nur alphanumerische und übers ganze DOIF eindeutige Schlüssel verwenden
### TPL_BM, (Bewegung, lokale Helligkeit), ansonsten wie TPL_BG
### Schlafen:  0 = nein, 1 = nur beim Schlafen, >1 = immer
###             Key                                    EventDev                Reading            Value        Schalt-Device                                Timer    Schlafen    SetOnCmd
#push (@{$_bm},["EGflBMEGflSWLicht",                    "EG.fl.BM",                "occupancy",    "true",     "EG.fl.SW.Licht",                            120,    0,            "on"]);
#push (@{$_bm},["EGflBMGSegLMHaus",                    "EG.fl.BM",                "occupancy",    "true",     "GS.eg.LM.Haus",                            120,    1,            "on"]);
#
#
#push (@{$_bm},["EGflTKHaustuerGSegLMHaus",            "EG.fl.TK.Haustuer",    "state",        "open",        "GS.eg.LM.Haus",                            120,    2,            "on"]);
#push (@{$_bm},["EGflTKHaustuerEGflSWLicht",            "EG.fl.TK.Haustuer",    "state",        "open",        "EG.fl.SW.Licht",                            120,    0,            "on"]);
#
#push (@{$_bm},["EGgaTKTorEGgaLMDecke",                "EG.ga.TK.Garagentor",    "state",        "open",     "EG.ga.LM.Decke",                            300,    2,            "on"]);
#
#push (@{$_bm},["EGkuWSKochinselEGkuLM",               "EG.ku.WS.Kochinsel_Motion","state",    "motion",     "EG.ku.XX.Licht.di",                        120,    0,            "warm"]);
#push (@{$_bm},["EGkuWSKochinselEGkuLMAsleep",        "EG.ku.WS.Kochinsel_Motion","state",    "motion",     "EG.ku.XX.Licht.di",                        120,    1,            "night"]);
#
#push (@{$_bm},["GSefDIHoftorGSegLMDeckeNW",            "GS.ef.DI.Hoftor",        "state",        "uncertain","GS.eg.LM.DeckeNW",                            300,    2,            "warm"]);
#push (@{$_bm},["GSefDIHoftorGSegLMHaus",            "GS.ef.DI.Hoftor",        "state",        "uncertain","GS.eg.LM.Haus",                            300,    2,            "on"]);
#}
#   FUUID      637a6969-f33f-c28a-71de-141e277afeff8a8f
#   MODEL      Perl
#   NAME       NN.xx.XX.Test2.di
#   NOTIFYDEV  global
#   NR         573
#   NTFY_ORDER 50-NN.xx.XX.Test2.di
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    29460 2024-12-29 20:25:48
#   eventCount 2
#   READINGS:
#     2025-03-20 16:05:42   mode            enabled
#     2025-03-20 16:05:42   state           initialized
#     2024-04-11 09:32:55   test            1200
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#   condition:
#   helper:
#     NOTIFYDEV  global
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#   perlblock:
#   uiState:
#   uiTable:
#   var:
#     bm:
#       ARRAY(0x55a2c9640cc0)
#       ARRAY(0x55a2d7aa03d8)
#       ARRAY(0x55a2d7a8bbf0)
#       ARRAY(0x55a2d8036800)
#       ARRAY(0x55a2dbadda68)
#       ARRAY(0x55a2d7aa06a8)
#       ARRAY(0x55a2cb461d48)
#       ARRAY(0x55a2c95d44f0)
#       ARRAY(0x55a2dbad0e00)
#
setstate NN.xx.XX.Test2.di initialized
setstate NN.xx.XX.Test2.di 2025-03-20 16:05:42 mode enabled
setstate NN.xx.XX.Test2.di 2025-03-20 16:05:42 state initialized
setstate NN.xx.XX.Test2.di 2024-04-11 09:32:55 test 1200


Titel: Aw: Perl-DOIFs können nicht mehr gespeichert werden
Beitrag von: Damian am 20 März 2025, 17:27:56
Ich kann bei mir in deiner Definition die eine push-Zeile hinzufügen und im Editor speichern. Ich benutze allerdings den codemirror.
Titel: Aw: Perl-DOIFs können nicht mehr gespeichert werden
Beitrag von: bstaeheli am 20 März 2025, 17:31:51
Danke, Damian. Hast du mir die RAW Definition von deinem Device mit der zusätzlichen Zeile?

Bei mir funktioniert es weder in meinem Produktiven, noch Test-System.

Benutzt du auch ConfigDB?
Titel: Aw: Perl-DOIFs können nicht mehr gespeichert werden
Beitrag von: Damian am 20 März 2025, 17:40:38
defmod NN.xx.XX.Test2.di DOIF subs {\
## Ein Szenario wird durch Hinzufügen einer Definitionszeile erstellt, ACHTUNG nur alphanumerische und übers ganze DOIF eindeutige Schlüssel verwenden\
## TPL_BM, (Bewegung, lokale Helligkeit), ansonsten wie TPL_BG\
## Schlafen:  0 = nein, 1 = nur beim Schlafen, >1 = immer\
##             Key                                    EventDev                Reading            Value        Schalt-Device                                Timer    Schlafen    SetOnCmd\
push (@{$_bm},["EGflBMEGflSWLicht",                    "EG.fl.BM",                "occupancy",    "true",     "EG.fl.SW.Licht",                            120,    0,            "on"]);;\
push (@{$_bm},["EGflBMGSegLMHaus",                    "EG.fl.BM",                "occupancy",    "true",     "GS.eg.LM.Haus",                            120,    1,            "on"]);;\
\
\
push (@{$_bm},["EGflTKHaustuerGSegLMHaus",            "EG.fl.TK.Haustuer",    "state",        "open",        "GS.eg.LM.Haus",                            120,    2,            "on"]);;\
push (@{$_bm},["EGflTKHaustuerEGflSWLicht",            "EG.fl.TK.Haustuer",    "state",        "open",        "EG.fl.SW.Licht",                            120,    0,            "on"]);;\
\
push (@{$_bm},["EGgaTKTorEGgaLMDecke",                "EG.ga.TK.Garagentor",    "state",        "open",     "EG.ga.LM.Decke",                            300,    2,            "on"]);;\
\
push (@{$_bm},["EGkuWSKochinselEGkuLM",               "EG.ku.WS.Kochinsel_Motion","state",    "motion",     "EG.ku.XX.Licht.di",                        120,    0,            "warm"]);;\
push (@{$_bm},["EGkuWSKochinselEGkuLMAsleep",        "EG.ku.WS.Kochinsel_Motion","state",    "motion",     "EG.ku.XX.Licht.di",                        120,    1,            "night"]);;\
\
push (@{$_bm},["GSefDIHoftorGSegLMDeckeNW",            "GS.ef.DI.Hoftor",        "state",        "uncertain","GS.eg.LM.DeckeNW",                            300,    2,            "warm"]);;\
push (@{$_bm},["GSefDIHoftorGSegLMHaus",            "GS.ef.DI.Hoftor",        "state",        "uncertain","GS.eg.LM.Haus",                            300,    2,            "on"]);;\
push (@{$_bm},["GSegBMEckeNOGSegLMHaus",            "GS.eg.BM.EckeNO",        "state",        "motion",    "GS.eg.LM.Haus",                            120,    2,            "on"]);;\
}
attr NN.xx.XX.Test2.di readingList test
attr NN.xx.XX.Test2.di room DEV
attr NN.xx.XX.Test2.di setList test:slider,0,100,9000

setstate NN.xx.XX.Test2.di initialized
setstate NN.xx.XX.Test2.di 2025-03-20 17:39:08 mode enabled
setstate NN.xx.XX.Test2.di 2025-03-20 17:39:08 state initialized


Ich benutze nicht ConfigDB.

Titel: Aw: [gelöst] Perl-DOIFs können nicht mehr gespeichert werden
Beitrag von: bstaeheli am 22 März 2025, 14:30:44
Uff... Wir leiten die FHEM-UI über den HTTP-Proxy Traefik, durch Authelia abgesichert.

In der Browser-Konsole erhielten wir einen HTTP Error 431, Request Header too large. - Das gesamte DOIF wird in der URL übertragen und nicht im Body, per POST.


Der Übeltäter war in unserem Fall Authelia. Im Authelia-Config-YAML müssen die Buffer angepasst werden. Wir haben es nun mal auf 64 KB erhöht:
server:
  address: tcp://0.0.0.0:9091/
  buffers:
    read: 65536
    write: 65536


Danke dir vielmals, Damian fürs Testen!