FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: RalfRog am 22 Juli 2023, 16:44:28

Titel: [gelöst] DOIF mit GetFileFromURL im Befehlsteil
Beitrag von: RalfRog am 22 Juli 2023, 16:44:28
Habe einen Shelly, der per Action ein Reading in FHEM setzen soll und dafür natürlich das aktuelle CSRF-Token braucht.

Folgendes Kommando über die Befehlszeile im FHEM-Web abgesetzt funktioniert (damit ist die Funktion GetFileFromURL mit Timeout 1sek aus HttpUtils wohl korrekt):
eine Zeile: Umbrüche hier zur Lesbarkeit
{
GetFileFromURL(
"http://shellyIP/settings/actions?index=0
&name=btn_on_url
&enabled=true
&urls[]=http://FHEM-IP:8083/fhem?XHR=1%26cmd=setreading%2520shly%2520Tor_Status%25200%26fwcsrf=".substr($FW_CSRF,8,20),1);
fhem("setreading initDoIf lastCSRFtim setCSRF")
}

Das ganze in einem DOIF Befehlsteil verpackt läuft nicht.
Da die Kommandozeile funktioniert vermute ich, dass die fehlenden [] (bei &urls) durch DOIF verursacht werden.
über tcpdump habe ich festgstellt, dass an den Shelly folgendes versendet wird und der daraufhin entsprechend antwortet und die Action nicht gesetzt hat:
GET /settings/actions?index=0
&name=btn_on_url
&enabled=true
&urls=http://FHEM-IP:8083/fhem?XHR=1%26cmd=setreading%2520shly%2520Tor_Status%25200%26fwcsrf=csrf_134755875422801

==> Hinter "&urls" fehlen die []. Ob einfache oder doppelte Anführungszeichen oder Erstzung der [] durch %5B%5D es kommt nicht korrekt an.
        Wie muss ich das maskieren, damit die [] nicht entfernt werden.



List DOIF
define initDoIf DOIF ([initNotify:"^initevent:.done$"]) { GetFileFromURL("http://shellyIP/settings/actions?index=0&name=btn_on_url&enabled=true&urls[]=http://FHEM-IP:8083/fhem?XHR=1%26cmd=setreading%2520shly%2520Tor_Status%25200%26fwcsrf=".substr($FW_CSRF,8,20),1);; fhem("setreading initDoIf  lastCSRFtim setCSRF")}
attr initDoIf do always
attr initDoIf verbose 5
#   DEF        ([initNotify:"^initevent:.done$"]) { GetFileFromURL("http://shellyIP/settings/actions?index=0&name=btn_on_url&enabled=true&urls[]=http://FHEM-IP:8083/fhem?XHR=1%26cmd=setreading%2520shly%2520Tor_Status%25200%26fwcsrf=".substr($FW_CSRF,8,20),1); fhem("setreading initDoIf  lastCSRFtim setCSRF")}
#   FUUID      64ba7652-f33f-84d4-bfe8-bf35e59a62a01411
#   FVERSION   98_DOIF.pm:0.274180/2023-04-09
#   MODEL      FHEM
#   NAME       initDoIf
#   NOTIFYDEV  initNotify,global
#   NR         68
#   NTFY_ORDER 50-initDoIf
#   STATE      cmd_1
#   TYPE       DOIF
#   VERSION    27418 2023-04-09 21:23:46
#   eventCount 23
#   READINGS:
#     2023-07-22 16:30:24   Device          initNotify
#     2023-07-22 16:30:25   cmd             1
#     2023-07-22 16:30:25   cmd_event       initNotify
#     2023-07-22 16:30:25   cmd_nr          1
#     2023-07-22 16:30:24   e_initNotify_events initevent: done
#     2023-07-22 16:30:25   lastCSRFtim     setCSRF
#     2023-07-22 16:29:08   mode            enabled
#     2023-07-22 16:30:25   state           cmd_1
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       initNotify:
#         0:
#           &STATE     ^initNotify$
#   attr:
#     cmdState:
#     wait:
#     waitdel:
#   condition:
#     0          ::EventDoIf('initNotify',$hash,'^initevent:.done$',1)
#   do:
#     0:
#       0          { GetFileFromURL("http://shellyIP/settings/actions?index=0&name=btn_on_url&enabled=true&urls[]=http://FHEM-IP:8083/fhem?XHR=1%26cmd=setreading%2520shly%2520Tor_Status%25200%26fwcsrf=".substr($FW_CSRF,8,20),1); fhem("setreading initDoIf  lastCSRFtim setCSRF")}
#     1:
#   helper:
#     NOTIFYDEV  initNotify,global
#     event      initevent: done
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#     timerdev   initNotify
#     timerevent initevent: done
#     triggerDev initNotify
#     DOIF_eventa:
#       cmd_nr: 1
#       cmd: 1
#       cmd_event: initNotify
#       cmd_1
#     DOIF_eventas:
#       cmd_nr: 1
#       cmd: 1
#       cmd_event: initNotify
#       state: cmd_1
#     timerevents:
#       initevent: done
#     timereventsState:
#       initevent: done
#     triggerEvents:
#       initevent: done
#     triggerEventsState:
#       initevent: done
#   internals:
#   perlblock:
#   readings:
#   trigger:
#     all         initNotify
#   uiState:
#   uiTable:
#
setstate initDoIf cmd_1
setstate initDoIf 2023-07-22 16:30:24 Device initNotify
setstate initDoIf 2023-07-22 16:30:25 cmd 1
setstate initDoIf 2023-07-22 16:30:25 cmd_event initNotify
setstate initDoIf 2023-07-22 16:30:25 cmd_nr 1
setstate initDoIf 2023-07-22 16:30:24 e_initNotify_events initevent: done
setstate initDoIf 2023-07-22 16:30:25 lastCSRFtim setCSRF
setstate initDoIf 2023-07-22 16:29:08 mode enabled
setstate initDoIf 2023-07-22 16:30:25 state cmd_1
Titel: Aw: DOIF mit GetFileFromURL im Befehlsteil
Beitrag von: RalfRog am 22 Juli 2023, 19:27:35
Seit gestern suche ich mit diversen Varianten im Suchbegriff. Jetzt habe ich per Suchmaschine doch noch was gefunden.
https://forum.fhem.de/index.php?topic=89194.0

Demnach muss ich wohl in den Perl Modus wechseln und eine sub definieren...  => "DOIF im Perl-Modus, eckige Klammern escapen" / " [] escapen"

Edit
Funktioniert.
Musste natürlich darauf achten die Funktion & Variable aus Main mit :: zu versehen