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
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"
EditFunktioniert.
Musste natürlich darauf achten die Funktion & Variable aus Main mit :: zu versehen
- ::GetFileFromURL
- $::FW_CSRF