#SingleInstance force
#Persistent
/*
Zur Ansteuerung der Edimax SP-1101W Funk-WLAN-Schaltsteckdose, ein/aus mit Flip/Flop wenn auf das
Trayicon geklickt wird
Die Komm. mit dem Smartplung erfolgt über CURL via IP, da werden XML-Steuerdateien mitgeschickt bzw.
das Gerätefeedback kommt auch per XML über CURL zurück. Es sind 3 XML-Steuerdateien
Alle 10 Sec wird der Status des SP-1101W gecheckt - er kann ja auch manuell geschalten werden - wenn er eine Flanke Aus-Ein hat, dann wird das Ding
nach einer definierten Timeout-Zeit (z.B. 30 min) ausgeschalten
*/
/* CURL-Commands
curl -d @off.xml http://admin:[email protected]:10000/smartplug.cgi -o "test.txt"
curl -d @on.xml http://admin:[email protected]:10000/smartplug.cgi
curl -d @status_powerstate.xml http://admin:[email protected]:10000/smartplug.cgi -o "ps.txt"
smartplug_off.xml
smartplug_on.xml
smartplug_powerstate.xml
*/
/* Response auf einen Schaltvorgang
<?xml version="1.0" encoding="UTF8"?><SMARTPLUG id="edimax"><CMD id="setup">OK</CMD></SMARTPLUG>
*/
/* Response auf die Statusanfrage
<?xml version="1.0" encoding="UTF8"?><SMARTPLUG id="edimax"><CMD id="get"><Device.System.Power.State>OFF</Device.System.Power.State></CMD></SMARTPLUG>
*/
; damit fangen wir die Clicks auf das Trayicon ab
OnMessage(0x404, "AHK_NOTIFYICON") ; WM_USER + 4 ; die Funktion "AHK.." wird aufgerufen wenn die Message "0x404" ausgelöst wird
; ein schönes Icon anlegen
ico_aus:="stecker_rot.ico"
ico_ein:="stecker_gruen1.ico"
Menu, tray, Icon, %ico_ein%
; Trayicon
Menu, Tray, NoStandard
menu, tray, tip, Info
Menu, tray, add, Exit, raus
menu, tray, click, 1
; ein paar Definitionen ,,, dann mal zu ändern
global smartplug_ip:="192.168.178.27"
global smartplug_user:="admin"
global smartplug_pass:="1234"
global outputdatei:="smartplug_output.txt"
timeout:=1000 * 60 * 30 ; Angabe in Millisekunden, danach wird automatisch abgeschalten!, 30 min
; ist der Smartplug überhaupt erreichbar via IP ?? -- wenn NEIN dann raus!!!
if not(ping_alive(smartplug_ip))
{
msgbox, Die IP-Adresse: %smartplug_ip% des Smartplug ist NICHT erreichbar
ExitApp
}
; der Status wird laufend aktualisiert
; diese Routine sorgt alle 10 sec dafür, dass der Status aktualisiert wird.
settimer, label_status, % 1000 * 10 ; alle 10 sec
; beim Start auch gleich mal den Status holen
gosub label_status
return
;; ############################################################
;; Auswertung der Clicks auf das Trayicon
;; ############################################################
; macht die Auswertung der OnMessage-Aufrufe auf das Trayicon
; die Funktion "AHK_NOTIFYICON" wird von OnMessage (ganz oben) aufgerufen
; die verschiedenen WM-Codes sind hier http://*******/tsnPA definiert
AHK_NOTIFYICON(wParam, lParam)
{
Global click ; definiert die variable CLICK als globale Variable
if (lParam = 0x200) ; WM_MOUSEOVE
{
;GoSub,TrayiconInfofenster
;Menu, Tray, Tip, %A_Now%
text:="Smartplug: " smartplug_ip " --> " statusle
Menu, Tray, Tip, %text%
Return 0
}
If lParam = 0x201 ; WM_LBUTTONUP
{
click = 1
SetTimer, trayicon_clickcheck, -250 ; der Timer wird nur 1x aufgerufen
Return 0
}
Else If lParam = 0x203 ; WM_LBUTTONDBLCLK
{
click = 2
Return 0
}
}
trayicon_clickcheck: ; Auswertung der OnMessage-Aufrufe bei einem Click auf das TrayIcon des Programms
If click = 1 ; einfacher Click auf das Trayicon
{
;Msgbox 1
gosub label_status ; status aktualisieren
}
Else If click = 2 ; doppelter Click auf das Trayicon
{
;Msgbox 2
gosub label_toggle ; den Smartplug umschalten
}
Return
;; ############################################################
;; Labels die angesprungen werden
;; ############################################################
; diese Labels werden angesprungen bei Clicks auf das Trayicon
; das Trayicon wird je nach Status umgestellt
label_status:
if (smartplug_status() = "ON")
{
Menu, tray, Icon, %ico_ein%
global statusle:="EIN"
}
else
{
Menu, tray, Icon, %ico_aus%
global statusle:="AUS"
}
if (statusle = "EIN" and status_vorher = "AUS") ; vorher
{
trigger_ausein:=1
}
else
trigger_ausein:=0
if (statusle = "AUS" and status_vorher = "EIN") ; vorher
{
trigger_einaus:=1
}
else
trigger_einaus:=0
if trigger_ausein ; automatischen Ausschalttimer Starten, es ist ja immer noch ein, Aus-Ein-Flanke
{
settimer, offtimer1, % timeout
}
if trigger_einaus ; Ausschalttimer rücksetzen, es wurde ja bereits manuell bzw. von wem anderen ausgeschalten, Ein-Aus-Flanke
settimer, offtimer1, Off
status_vorher:=statusle
return
; dieses Label wird vom Ausschalttimer angesprungen, automatisch ausschalten nach Zeit
offtimer1:
settimer, offtimer1, Off ; Timer schaltet sich selbst ab, er soll ja nur 1x laufen
;msgbox, abgelaufen
status1:=smartplug_off() ; ausschalten
return
; der Schaltzustand des Smartplug wird getoggled, wenn Ein, dann aus und vice-versa
label_toggle:
; wir toggeln....
done:=0
temp_status:=smartplug_status()
if (temp_status = "ON")
{
done:=1
status1:=smartplug_off()
}
temp_status:=smartplug_status()
if (temp_status = "OFF") and (done = 0)
{
done:=1
status1:=smartplug_on()
}
if (smartplug_status() = "ON")
{
Menu, tray, Icon, %ico_ein%
}
else
{
Menu, tray, Icon, %ico_aus%
}
return
raus:
ExitApp
return
;; ############################################################
;; Funktionen
;; ############################################################
; Kommunikation mit dem Smartplug
; liefert ein "OK", wenns klappt
smartplug_on() ; wenn die IP nicht erreichbar, dann kommt hier "Mist", dh. kein OK zurück!
{
global
befehlsdatei:="smartplug_on.xml"
caller:="curl -d @" befehlsdatei " http://" smartplug_user ":" smartplug_pass "@" smartplug_ip ":10000/smartplug.cgi -o " outputdatei
shellstring:=comspec " /c " . caller
runwait, %shellstring%, ,hide useerrorlevel
return check_output_ok(outputdatei)
}
; liefert ein "OK", wenns klappt
smartplug_off() ; wenn die IP nicht erreichbar, dann kommt hier "mist", dh. kein OK zurück!
{
global
befehlsdatei:="smartplug_off.xml"
caller:="curl -d @" befehlsdatei " http://" smartplug_user ":" smartplug_pass "@" smartplug_ip ":10000/smartplug.cgi -o " outputdatei
shellstring:=comspec " /c " . caller
runwait, %shellstring%, ,hide useerrorlevel
return check_output_ok(outputdatei)
}
; liefert ein "ON" oder ein "OFF" als Status des Smartplug
smartplug_status()
{
global
befehlsdatei:="smartplug_powerstate.xml"
caller:="curl -d @" befehlsdatei " http://" smartplug_user ":" smartplug_pass "@" smartplug_ip ":10000/smartplug.cgi -o " outputdatei
shellstring:=comspec " /c " . caller
runwait, %shellstring%, ,hide useerrorlevel
return check_output_on_off(outputdatei)
}
; holt das Ergebnis aus der CURL-Rückgabedatei nach einer Komm. mit dem Smartplug wegen dem Status
check_output_on_off(datei)
{
global
;FileRead, Contents, C:\Address List.txt
daten:=""
Fileread, daten, %datei%
pos_vor:=instr(daten, "<Device.System.Power.State>", 1)+strlen("<Device.System.Power.State>")
pos_nach:=instr(daten, "</Device.System.Power.State>", 1)
ergebnis:=trim(substr(daten,pos_vor, pos_nach-pos_vor))
return ergebnis
}
; holt das Ergebnis aus der CURL-Rückgabedatei nach einer Komm. mit dem Smartplug wenn ON oder OFF gesendet wurde
check_output_ok(datei)
{
;FileRead, Contents, C:\Address List.txt
daten:=""
Fileread, daten, %datei%
pos_vor:=instr(daten, "<CMD id=" chr(34) "setup" chr(34)">", 1)+strlen("<CMD id=" chr(34) "setup" chr(34)">")
pos_nach:=instr(daten, "</CMD></SMARTPLUG>", 1)
ergebnis:=trim(substr(daten,pos_vor, pos_nach-pos_vor))
return ergebnis
}
; die Funktion gibt "0" zurück, wenn der Host nicht errichbar ist, ansonsten "1"
; ein einfaches PING
; z.B. istderda:=ping_alive("10.0.0.19")
ping_alive(computer)
{
strComputer := "."
objWMIService := ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" . strComputer . "\root\cimv2")
selectstring:="Select * From Win32_PingStatus where Address = '" . computer . "'"
;colPings := objWMIService.ExecQuery("Select * From Win32_PingStatus where Address = '10.0.0.148'")._NewEnum
colpings:=objwmiservice.execquery(selectstring)._NewEnum
While colPings[objStatus]
{
If (objStatus.StatusCode="" or objStatus.StatusCode<>0)
back:=0
Else
back:=1
}
return back
}