Macmissionar hat geschrieben:Ein altes Kernproblem bleibt jedoch: Wenn man zum Beispiel sagt, alle Geräte im Wohnzimmer aus, dann macht Siri das mittels homebridge sehr zuverlässig – innerhalb kürzester Zeit werden alle Geräte geschaltet.
Und hier liegt das Problem: Immer, immer wieder wird leider die Config zerschossen, da FB.Switch da einfach unsauber arbeitet und sich vermutlich Lese- und Schreibvorgänge gegenseitig überholen.
Dann landen immer wieder unsaubere Schmierzeichen in der config und auch wenn homebridge dann noch läuft, funzt gar nichts mehr, da FB.Switch selbst nicht mehr arbeiten kann. Beim Aufruf erscheint dann nur eine einzige Zeile "Kann Konfiguration nicht lesen …".
Meine Idee, da hapert es aber dann an php und ich stelle das in der Hoffnung hier rein, daß sich mr.berni dem annimmt, ist folgende:
In der Hauptseite wird, wannimmer ein Aufruf vorgenommen wird (ob vom Timer, von den Aktionen, manuell oder von außen, sprich Siri, egal,
immer), nicht einfach an den Execute-Handler übergeben, sondern erst dann, wenn ein globaler "ichbinbeschäftigt"-Marker false ist.
So, wenn er false ist, dann wird an den ausführenden Teil übergeben. Das allererste, was der macht, ist den marker auf true zu setzen, und am Ende, unmittelbar vor seiner Rückgabe, auf false.
In Pseudo-Code so:
- Code: Alles auswählen
idle()
...
if geraetschalten is true then
repeat
if beschäftigt is false then
my action(device)
exit repeat
delay 0,5s
end if
end repeat
end if
end idle
action(device)
set beschaeftigt to true
...
#geräte schalten
...
set beschäftigt to false
end action
Dadurch wird nun, falls eine Schalttirade auf FB.Switch einprasselt, er immer wieder in der Hauptschleife erst dann an den Ausführer übergeben, bis der intern fertig ist.
Ich habe dieses Konzept in einigen meiner Programm drin, um eben die Threadsicherheit zu gewähren. Das klappt dort auch sehr zuverlässig. Wäre schön, wenn das umgesetzt werden würde.
Denn dann bräuchte ich folgendes Hilfsscript "Config reparieren", welches ich gut erreichbar in meinem Netzwerk auf zwei Macs liegen habe, nicht mehr:- Code: Alles auswählen
tell application "Terminal"
do script ""
delay 0.7
my execCmd("ssh benutzer@192.168.xxx.xxx", 1)
my execCmd("kennwort", 1.7)
my execCmd("cp '/var/www/html/fb.switch/data/config SIK.xml' '/var/www/html/fb.switch/data/config.xml'", 1)
my execCmd("sudo chmod -R 777 /var/www/html/fb.switch/data/", 1)
my execCmd("logout", 0.5)
my execCmd("logout", 0)
end tell
on execCmd(cmd, wait)
tell application "System Events"
tell application process "Terminal"
set frontmost to true
keystroke cmd
keystroke return
end tell
end tell
delay wait
end execCmd
Das Script ist also etwas aufgebohrt und muß nun das Terminal ansprechen, da der chmod-Befehl (der war auf meiner QNAP nicht nötig) sonst nicht abgesetzt werden kann.