TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

buempi
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz

TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Beitrag von buempi » 30.01.2012, 15:42

Hallo zusammen

In diesem Thread hatten wir nach einer Möglichkeit gesucht, den Zustand einer Systemvariablen im Systray eines Windows-Rechners anzuzeigen.

Das Programmier-Tool AutoIt (Freeware), welches ich sehr häufig bei mir einsetze und mit welchem ich auch den MiniBrowser geschrieben habe, ermöglicht es unter anderem, beliebige Icons in die Taskleiste einzubinden. Ich kannte aber bisher keinen Weg, wie AutoIt direkt mit der CCU kommunizieren könnte. Irgendwie war ich immer der Meinung, die Kommunikation nach Aussen würde über ein spezielles Übertragungsprotokoll erfolgen.

Holger71 hat mir dann spontan die verschiedenen Zugriffsmöglichkeiten aufgezeigt. Ich danke ihm an dieser Stelle ganz herzlich. Ohne seinen Input gäbe es "TrayMatic", das ich hier vorstelle, nicht!


TrayMatic ist ein Windows-Programm, welches auf allen Windows-Rechnern ab W98 ausgeführt werden kann. Man kann damit:

1. Den aktuellen Zustand von Schalt-Modulen und logischen Systemvariablen mit selbst gewählten Bildchen (Icons) im Systray (neben der Uhr) anzeigen.

2. Wenn gewünscht, diesen Zustand mit Mausklick hin- und herschalten.

3. Einen kurzen oder langen Tastendruck auf virtuelle Fernbedienungen (Funk oder wired) auslösen.

Das Programm kann mehrfach mit unterschiedlichen Objekt-Bezügen gestartet werden. Man kann also mehrere Objekte gleichzeitig mit individuellen Icons überwachen und steuern. Das erreicht man, indem man für jedes Objekt eine kleine INI-Datei erstellt. Diese kann z.B. wie folgt aussehen:

Code: Alles auswählen

[Einstellungen]

IPderCCU             = xxx.xxx.x.xx

; Es gibt folgende Modultypen:
; LogVar        (Logische Systemvariable true/false)
; SchalterFunk  (Funk-Schalter)
; SchalterWired (Wired-Schalter)
; VirtFBfunk    (Virtuelle Fernbedienung Funk)
; VirtFBwired   (Virtuelle Fernbedienung wired)

ModulTyp             = SchalterFunk


; Serien-Nr. und Kanal des Moduls (z.B. IEQ0054321:1) oder Name der Systemvariablen 
; Achtung: Bei virtuellen Fernbedienungen NUR die Kanal-Nummer eintragen!

SerNr                = IEQ0054321:1


; Intervall in Sekunden für die Aktualisierung des Zustandes
; von Variablen und Schaltern  (keine Auswirkung bei Fernbedienungen)

AktIntervall         = 10


; Kann der Benutzer Schalter und logische Systemvariablen durch Mausklick umschalten?
; Zum Deaktiviern einfach den ganzen Eintrag aus der INI löschen (oder auf 0 setzen)
; Virtuelle Fernbedienungen können IMMER geschaltet werden

SchaltenErlaubt      = 1


; Icon, welches angezeigt wird, wenn der Zustand unbekannt ist
; (beim Start oder wenn keine Verbindung zur CCU besteht)

IconStart            = Stern.ico


; Icons, die beim Zustand true bzw. false angezeigt werden
; Bei Objekten mit nur einem Zustand (Fernbedienung) wird immer IconStart angezeigt

IconTrue             = DruckerEin.ico
IconFalse            = DruckerAus.ico


; Tool-Tipps bei den entsprechenden Zuständen (bei Fernbedienungen wird immer TipStart verwendet)
; Ist kein Tipp gewünscht, hinter dem Leerzeichen einfach leer lassen

TipStart             = Drucker
TipTrue              = Drucker EIN
TipFalse             = Drucker AUS


; Trey-Menu für kurzen bzw. langen Tastendruck (nur beim Typ Fernbedienung)

MenuKurz             = 
MenuLang             = 
Wenn TrayMatic nun mit dieser INI-Datei (z.B. im Autostart) über die Befehlszeile

Code: Alles auswählen

TrayMatic.exe Drucker.ini
gestartet wird, ist jederzeit sichtbar, ob der Drucker läuft. Wenn nicht, genügt ein Linksklick auf das Icon, und die Funksteckdose wird eingeschaltet.

Weitere INI-Dateien können durch einen erneuten Aufruf der EXE gestartet werden.

Bei Fernbedienungen wird nach einem Linksklick die Auswahlmöglichkeit eines kurzen oder langen Tastendrucks angeboten, womit man dann über Direktverknüpfungen, Programme oder Skripte beliebige Aktionen auslösen kann.

Jede Instanz von TrayMatic.exe kann mit Rechtsklick auf ihr Icon beendet werden.

Ein paar wenige Icons liegen bei. Im Netz findet man mehr davon. Hier ein paar Adressen:

http://www.icone.goldenweb.it/index.php?l=en
http://www.veryicon.com/icons/
http://www.mricons.com/
http://icons.mysitemyway.com/

Meine Testmöglichkeiten sind leider sehr eingeschränkt. Deshalb ist es schon möglich, dass das Eine oder Andere am Anfang nicht perfekt funktioniert... :roll:

Viel Spass!
Bümpi

Aktuelle Version:
TrayMatic11.zip
Inkl. Unterstützung für Dimmer/Rollläden
(394.04 KiB) 1145-mal heruntergeladen
Frühere Version:
TrayMatic.zip
Windows 98 - kompatibel (ohne Dimmer/Rollläden)
(228.5 KiB) 251-mal heruntergeladen
Die jeweils enthaltene Datei "TrayMatic.au3" enthält den AutoIt-Quelltext (für Interessierte) und wird zur Ausführung nicht benötigt.

Hier befindet sich eine Version, mit der man virtuelle Homeputer-Objekte und -Variablen schalten sowie Makros starten kann.

Basic
Beiträge: 933
Registriert: 07.03.2010, 12:39
Wohnort: Deutschland

Re: TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Beitrag von Basic » 30.01.2012, 16:19

Ich hab gerade den ersten Versuch gemacht - geht sehr fix einzurichten, reagiert auch schnell und funktioniert prima!
Sehr gute Arbeit!

MaxWrestler
Beiträge: 237
Registriert: 11.12.2011, 13:19

Re: TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Beitrag von MaxWrestler » 30.01.2012, 18:40

Hallo buempi,
danke für dieses tolle Programm !

Jetzt muss ich nicht mehr das lahme WebUi aufrufen um schnell mal was ein/aus zuschalten !!!
Der Dimmer funktioniert noch nicht.(HM-LC-Dim1L-CV)

Sind Temperatur und Feuchte auch geplant ?

gruß MaxW.

PS:Ganz einfach eine Verknüpfung für Traymatik anlegen und nach bedarf editieren.
Die Verknüpfung in den Autostart Ordner und fertig !
TrayMatic - Verknüpfung.jpg

Benutzeravatar
Sammy
Beiträge: 6721
Registriert: 09.09.2008, 20:47

Re: TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Beitrag von Sammy » 30.01.2012, 23:23

Hallo und danke buempi!

ich hab das bisher über verknüpfungen in der Schnellstart-Leiste realisiert gehabt (Für jede Aktion ein separates Symbol) aber so ist das natürlich noch schöner.
Ich würde auch gerne Dimmer steuern, kenne mich mit AutoIt aber nicht aus. Bei meinem jetzigen versuch das umzuschreiben hapert es an der Abfrage und dem zurückgelieferten Level, worauf die fehlermeldung erscheint. Ist für Dich wahrscheinlich ne Kleinigkeit, oder?

Hier mein modifiziertes TrayMatic.ou

Code: Alles auswählen

; =================== Mit altem Compiler compilieren, damit W98-kompatibel! =================================
; ===========================================================================================================

#NoTrayIcon
#include <Inet.au3>
#include <String.au3>
#include <Constants.au3>

$Prg                        = "TrayMatic 1.1"
$Meldung                    = ""
$Fehler                     = ""

If Not @Compiled Then
   $INIDatei                = "Dimmer.ini"
Else
   If $CMDLine[0]          <> 1 Then
      $Meldung              = "Richtiger Programm-Aufruf:" & @CRLF & @CRLF & "TrayMatic   IniDatei.ini (ev. inkl. Pfad)"
      $Meldung              = $Meldung & @CRLF & @CRLF & "Beispiel: "      & @CRLF & @CRLF & "TrayMatic   Drucker.ini"
      ExitFehler()
   EndIf
   $INIDatei                = $CMDLine[1]
EndIf

If Not FileExists($INIDatei) Then
   If FileExists($INIDatei & ".ini") Then
      $INIDatei             = $INIDatei & ".ini"
   Else
      $Meldung              = 'INI-Datei "' & $INIDatei & '" nicht gefunden!'
      ExitFehler()
   EndIf
EndIf


; -------------------------------------- INI-Datei einlesen

$IPderCCU                   = IniRead($INIDatei,"Einstellungen","IPderCCU"            ,"")
$ModulTyp                   = IniRead($INIDatei,"Einstellungen","ModulTyp"            ,"LogVar")
$SerNr                      = IniRead($INIDatei,"Einstellungen","SerNr"               ,"Anwesenheit")
$AktIntervall               = IniRead($INIDatei,"Einstellungen","AktIntervall"        ,10)
$SchaltenErlaubt            = IniRead($INIDatei,"Einstellungen","SchaltenErlaubt"     ,0)
$IconStart                  = IniRead($INIDatei,"Einstellungen","IconStart"           ,"Stern.ico")
$IconTrue                   = IniRead($INIDatei,"Einstellungen","IconTrue"            ,"Rot.ico")
$IconFalse                  = IniRead($INIDatei,"Einstellungen","IconFalse"           ,"Gruen.ico")
$TipStart                   = IniRead($INIDatei,"Einstellungen","TipStart"            ,"Keine Verbindung")
$TipTrue                    = IniRead($INIDatei,"Einstellungen","TipTrue"             ,"")
$TipFalse                   = IniRead($INIDatei,"Einstellungen","TipFalse"            ,"")
$MenuKurz                   = IniRead($INIDatei,"Einstellungen","MenuKurz"            ,"")
$MenuLang                   = IniRead($INIDatei,"Einstellungen","MenuLang"            ,"")


; -------------------------------------- Fehlerprüfungen

; IP-Adresse

If $IPderCCU == "" Then
   $Meldung                 = 'In der INI-Datei "' & $INIDatei & '" keine IPderCCU gefunden!'
   ExitFehler()
EndIf

If Not PruefIP($IPderCCU) Then
   $Meldung                 = $IPderCCU & " ist keine gültige IP-Adresse!"
   ExitFehler()
EndIf

; ModulTyp

If $ModulTyp = "LogVar" Or $ModulTyp = "SchalterFunk" Or $ModulTyp = "DimmerFunk" Or $ModulTyp = "SchalterWired" Or $ModulTyp = "VirtFBfunk" Or $ModulTyp = "VirtFBwired" Then
   ; Weiter
Else
   $Meldung                 = '"' & $ModulTyp & '" ist kein gültiger Modultyp!'
   ExitFehler()
EndIf

; Serien-Nummer

If StringLeft($ModulTyp,6)  = "VirtFB" And Not StringIsDigit($SerNr) Then
   $Meldung                 = "Bei Fernbedienungen nur die Kanal-Nummer eintragen!" & @CRLF & @CRLF
   $Meldung                 = $Meldung & '"' & $SerNr & '" ist nicht gültig!'
   ExitFehler()
EndIf

; Prüfung Serien-Nummer auf "Q" und ":" weggelassen!


; Aktualisierungsintervall

If Not StringIsDigit($AktIntervall) Then
   If $AktIntervall == "" Then
      $Meldung              = "Der Aktualisierungsintervall muss in Sekunden angegeben werden!" & @CRLF & @CRLF
      $Meldung              = $Meldung & 'Sie haben hinter dem "=" nichts eingetragen!'
   Else
      $Meldung              = "Der Aktualisierungsintervall muss in Sekunden angegeben werden!" & @CRLF & @CRLF
      $Meldung              = $Meldung & '"' & $AktIntervall & '" ist nicht gültig!'
   EndIf
   ExitFehler()
EndIf

; Schalten erlaubt

If $SchaltenErlaubt <> "0" And $SchaltenErlaubt <> "1" Then
   If $SchaltenErlaubt     == "" Then
      $Meldung              = 'Bei "SchaltenErlaubt" muss 1 oder 2 eingetragen werden!' & @CRLF & @CRLF
      $Meldung              = $Meldung & 'Sie haben hinter dem "=" nichts eingetragen!' & @CRLF & @CRLF
      $Meldung              = $Meldung & 'Soll Schalten nicht erlaubt sein, können Sie auch die Zeile löschen.'
   Else
      $Meldung              = 'Bei "SchaltenErlaubt" muss 1 oder 2 eingetragen werden!' & @CRLF & @CRLF
      $Meldung              = $Meldung & $SchaltenErlaubt & " ist nicht gültig!"
   EndIf
   ExitFehler()
EndIf

; Icons

If Not FileExists($IconStart) Then
   If $IconStart == "" Then
      $Meldung              = 'Sie haben unter "IconStart" hinter dem "=" nichts eingetragen!'
   Else
      $Meldung              = 'Datei "' & $IconStart & '" nicht gefunden!'
   EndIf
   ExitFehler()
EndIf

If Not FileExists($IconTrue) And StringLeft($ModulTyp,6) <> "VirtFB" Then
   If $IconTrue == "" Then
      $Meldung              = 'Sie haben unter "IconTrue" hinter dem "=" nichts eingetragen!'
   Else
      $Meldung              = 'Datei "' & $IconTrue & '" nicht gefunden!'
   EndIf
   ExitFehler()
EndIf

If Not FileExists($IconFalse) And StringLeft($ModulTyp,6) <> "VirtFB" Then
   If $IconFalse == "" Then
      $Meldung              = 'Sie haben unter "IconFalse" hinter dem "=" nichts eingetragen!'
   Else
      $Meldung              = 'Datei "' & $IconFalse & '" nicht gefunden!'
   EndIf
   ExitFehler()
EndIf


; -------------------------------------- Ergänzungen

; Serien-Nummer

If StringLeft($ModulTyp,6)  = "VirtFB" Then
   While StringLen($SerNr)  > 1 And StringLeft($SerNr,1) = "0"
      $SerNr  = StringTrimLeft($SerNr,1)
   WEnd
EndIf

If $ModulTyp = "VirtFBfunk" Then
                             ; unbedingt Gross-/Kleinschreibung beachten!
   $SerNr                   = "BidCos-RF.BidCoS-RF:" & $SerNr
EndIf

If $ModulTyp = "VirtFBwired" Then
                             ; unbedingt Gross-/Kleinschreibung beachten!
   $SerNr                   = "BidCos-Wired.BidCoS-Wir:" & $SerNr
EndIf

;***********************************************************************************************************************************************

; Aktualisierungs-Intervall

If StringLeft($ModulTyp,6)  = "VirtFB" Then
   $AktIntervall            = 1000
Else
   If $AktIntervall         < 1 Then
      $AktIntervall         = 1
   EndIf
EndIf

; Tool-Tipp

If $TipStart == "" Then
   $TipStart                = " "
EndIf

If $TipTrue  == "" Then
   $TipTrue                 = " "
EndIf

If $TipFalse == "" Then
   $TipFalse                = " "
EndIf

If StringLeft($ModulTyp,6)  = "VirtFB" Then
   $TipTrue                 = $TipStart
   $TipFalse                = $TipStart	
EndIf

; Tray-Menu

If $MenuKurz == "" Then
   $MenuKurz                = "kurzer Tastendruck"
EndIf

If $MenuLang == "" Then
   $MenuLang                = "langer Tastendruck"
EndIf


; Anweisung

$AnweisungAnfang            = 'http://' & $IPderCCU & ':8181/Text.exe?Antwort=dom.GetObject("'

If $ModulTyp = "SchalterFunk" Then
   $AnweisungAnfang         = $AnweisungAnfang & 'BidCos-RF.' & $SerNr
EndIf

If $ModulTyp = "DimmerFunk" Then
   $AnweisungAnfang         = $AnweisungAnfang & 'BidCos-RF.' & $SerNr
EndIf

If $ModulTyp = "SchalterWired" Then
   $AnweisungAnfang         = $AnweisungAnfang & 'BidCos-Wired.' & $SerNr
EndIf

If StringLeft($ModulTyp,8) = "Schalter" Then
   $AnweisungAbfrage        = $AnweisungAnfang & '.STATE").Value();'
   $AnweisungEIN            = $AnweisungAnfang & '.STATE").State(1);'
   $AnweisungAUS            = $AnweisungAnfang & '.STATE").State(0);'
   $Status                  = "unbekannt"
EndIf

If StringLeft($ModulTyp,6) = "Dimmer" Then
   $AnweisungAbfrage        = $AnweisungAnfang & '.LEVEL").Value();'
   $AnweisungEIN            = $AnweisungAnfang & '.LEVEL").Level(1.0);'
   $AnweisungAUS            = $AnweisungAnfang & '.LEVEL").Level(0.0);'
   $Status                  = "unbekannt"
EndIf


If $ModulTyp = "LogVar" Then
   $AnweisungAnfang         = $AnweisungAnfang & $SerNr
   $AnweisungAbfrage        = $AnweisungAnfang & '").Value();'
   $AnweisungEIN            = $AnweisungAnfang & '").State(1);'
   $AnweisungAUS            = $AnweisungAnfang & '").State(0);'
   $Status                  = "unbekannt"
EndIf

If StringLeft($ModulTyp,6)  = "VirtFB" Then
   $AnweisungAnfang         = $AnweisungAnfang & $SerNr
   $AnweisungAbfrage        = $AnweisungAnfang & '.PRESS_SHORT").Value();'
EndIf

; Icons

If StringLeft($ModulTyp,6)  = "VirtFB" Then
   $IconTrue                = $IconStart
   $IconFalse               = $IconStart
EndIf

; -------------------------------------- Tray

Opt("TrayMenuMode",1)
Opt("TrayOnEventMode",1)

TraySetIcon($IconStart)
TraySetToolTip($TipStart)

If StringLeft($ModulTyp,8)  = "Schalter" Or StringLeft($ModulTyp,6)  = "Dimmer" Or $ModulTyp = "LogVar" Then
   If $SchaltenErlaubt = 1 Then
      TraySetClick(8)
      TraySetOnEvent($TRAY_EVENT_PRIMARYDOWN,"Umschalten")
   Else
      TraySetClick(9)
   EndIf
EndIf

If StringLeft($ModulTyp,6)  = "VirtFB" Then
   TraySetClick(9)
   $KurzItem                = TrayCreateItem($MenuKurz)
   $LangItem                = TrayCreateItem($MenuLang)
   TrayItemSetOnEvent($KurzItem,"TasteKurz" )
   TrayItemSetOnEvent($LangItem,"TasteLang" )
EndIf

$FehlerItem                 = ""
$EndeItem                   = TrayCreateItem("Programm beenden")
TrayItemSetOnEvent($EndeItem,"OnAutoItExit" )


; -------------------------------------- Haupt-Schleife
; ---------------------------------------------------------------------------------------------------------------------------------------------

While 1

   $Ergebnis                = ""
   $Zustand                 = ""
   $Zaehler                 = 0

   Aktualisieren()

   ; Nicht "Sleep($AktIntervall), damit nach jeder Tray-Menu-Aktion ein Aktualisieren erfolgt!
   While $Zaehler < $AktIntervall
      $Zaehler = $Zaehler + 1
      Sleep(1000)
   WEnd

WEnd

; ---------------------------------------------------------------------------------------------------------------------------------------------

Func Aktualisieren()

If Abfrage() Then
   If $FehlerItem <> "" Then
      TrayItemDelete($FehlerItem)
      $FehlerItem  = ""
   EndIf
   If $Zustand     = "true" Then
      TraySetIcon($IconTrue)
      TraySetToolTip($TipTrue)
   Else
      TraySetIcon($IconFalse)
      TraySetToolTip($TipFalse)
   EndIf
Else
   If $FehlerItem  = "" Then
      $FehlerItem  = TrayCreateItem("Fehler anzeigen")
      TrayItemSetOnEvent(-1,"FehlerAnzeige")
      TraySetIcon($IconStart)
      TraySetToolTip("Fehler!")
   EndIf
EndIf

EndFunc

; --------------------------------------

Func Abfrage()

$Ergebnis                   = _InetGetSource($AnweisungAbfrage)

If Auswerten() Then
   Return 1
Else
   ; 2. Versuch
   $Warten                  = Random(500,2000,1)
   Sleep($Warten)
   $Ergebnis                = _InetGetSource($AnweisungAbfrage)
   If Auswerten() Then
      Return 1
   Else
      Return 0
   EndIf
EndIf

EndFunc

; --------------------------------------

Func Auswerten()

If StringInStr($Ergebnis,"Antwort") = 0 Then
   $Fehler                  = "Keine Antwort der CCU!"
   Return 0
EndIf

$ZustandsArray              = _StringBetween($Ergebnis,"<Antwort>","</Antwort>")
$Zustand                    = $ZustandsArray[0]

If $Zustand = "true" Or $Zustand = "false" Then
   Return 1
Else
   $Fehler                  = 'Antwort der CCU: "' & $Zustand & '"'
   Return 0
EndIf

EndFunc

; --------------------------------------

Func FehlerAnzeige()

MsgBox(0,$Prg,$Fehler)

EndFunc

; --------------------------------------

Func Umschalten()

; Sicherheitshalber
If $SchaltenErlaubt = 0 Then Return

$ZustandAlt                 = $Zustand

If $Zustand = "true" Then
   $Ergebnis                = _InetGetSource($AnweisungAUS)
Else
   $Ergebnis                = _InetGetSource($AnweisungEIN)
EndIf

Sleep(300)
Aktualisieren()

If $Zustand = $ZustandAlt Then
   ; damit das nächste Aktualisieren etwas verzögert erfolgt!
   $Warten                  = Random(500,1000,1)
   Sleep($Warten)
EndIf

$Zaehler                    = $AktIntervall + 1

EndFunc

; --------------------------------------

Func TasteKurz()

$Anweisung                  = $AnweisungAnfang & '.PRESS_SHORT").State(true);'
$Ergebnis                   = _InetGetSource($Anweisung)

If Auswerten() Then
   TrayTip("",'"kurz" gesendet',1,17)
   Sleep(1500)
   TrayTip("","",1,17)
Else
   TrayTip("","Fehler!",2,18)
   Sleep(2500)
   TrayTip("","",1,18)
EndIf

$Ergebnis                   = ""

$Zaehler                    = $AktIntervall + 1

EndFunc

; --------------------------------------

Func TasteLang()

$Anweisung                  = $AnweisungAnfang & '.PRESS_LONG").State(true);'
$Ergebnis                   = _InetGetSource($Anweisung)

If Auswerten() Then
   TrayTip("",'"lang" gesendet',1,17)
   Sleep(1500)
   TrayTip("","",1,17)
Else
   TrayTip("","Fehler!",2,18)
   Sleep(2500)
   TrayTip("","",1,18)
EndIf

$Ergebnis                   = ""

$Zaehler                    = $AktIntervall + 1

EndFunc

; --------------------------------------

Func PruefIP($Parameter)

$IPArray        = StringSplit($Parameter,'.')

If $IPArray[0] <> 4 Then
   Return 0
EndIf

; Führende Nullen entfernen:

While StringLen($IPArray[1]) > 1 And StringLeft($IPArray[1],1) = "0"
   $IPArray[1]  = StringTrimLeft($IPArray[1],1)
WEnd

While StringLen($IPArray[2]) > 1 And StringLeft($IPArray[2],1) = "0"
   $IPArray[2]  = StringTrimLeft($IPArray[2],1)
WEnd

While StringLen($IPArray[3]) > 1 And StringLeft($IPArray[3],1) = "0"
   $IPArray[3]  = StringTrimLeft($IPArray[3],1)
WEnd

While StringLen($IPArray[4]) > 1 And StringLeft($IPArray[4],1) = "0"
   $IPArray[4]  = StringTrimLeft($IPArray[4],1)
WEnd


If StringIsDigit($IPArray[1]) And StringIsDigit($IPArray[2]) And StringIsDigit($IPArray[3]) And StringIsDigit($IPArray[4]) Then
   ; Weiter
Else
   Return 0
EndIf

If $IPArray[1]  > 255 Or $IPArray[2] > 255 Or $IPArray[3] > 255 Or $IPArray[4] > 255 Then
   Return 0
EndIf

; Alles OK!
$IPderCCU       = $IPArray[1] & "." & $IPArray[2] & "." & $IPArray[3] & "." & $IPArray[4]

Return 1

EndFunc

; --------------------------------------

Func ExitFehler()

MsgBox(0,$Prg,$Meldung)
Exit

EndFunc

; --------------------------------------

Func OnAutoItExit()

Exit

EndFunc

; --------------------------------------
Meine bisherige Ansteuerung des Dimmers über eine .bat sieht so aus:

Code: Alles auswählen

wget -q -O c:\temp\dimmer.htm "http://IP_DER_CCU:8181/test.exe?x=dom.GetObject('BidCos-RF.SERIENNUMMER:1.LEVEL').Level(0.9);"
Viele Grüße,
Sammy
Links: CCU-Logik, Tipps für Anfänger, WebUI-Doku, Expertenparameter, virtuelle Aktorkanäle
Inventur vom 22.01.14: 516 Kanäle in 165 Geräten, 132 Programme, 270 Direkte Verknüpfungen
Ich übernehme für alle von mir gegebenen Hinweise, Tipps und Links keine Haftung! Das Befolgen meiner Tipps ist nur für Fachkundige gedacht und erfolgt auf eigene Gefahr!

buempi
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz

Re: TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Beitrag von buempi » 31.01.2012, 12:29

Hallo Sammy

Gratuliere! Du hast dich schnell in mein Programm eingearbeitet, und die Punkte herausgefunden, wo Änderungen notwendig sind.

Wenn der Wget-Befehl funktioniert, müsste eigentlich das Ausschalten auch funktionieren; alle anderen Funktionen (Icon, Tooltip, Einschalten) nicht. Weil nämlich value() beim Dimmer kaum true oder false zurückgibt, wird bei Zeile 391 (in deinem AU3) ins "Else" gesprungen und ein Level(0.0) ausgelöst. Wenn das so ist, wären wir schon einen gewaltigen Schritt weiter!

Teste doch mal folgende Befehlszeilen, indem du die IP einträgst und die Seriennummer durch diejenige deines Dimmers ersetzst und dann nacheinander in die Adresszeile des Internet Explorers (oder eines anderen Browsers) kopierst:

Code: Alles auswählen

http://IPderCCU:8181/Text.exe?ergebnis=dom.GetObject("BidCos-RF.IEQ0049848:1.LEVEL").Value()
http://IPderCCU:8181/Text.exe?ergebnis=dom.GetObject("BidCos-RF.IEQ0049848:1.LEVEL").Level(0.4)
http://IPderCCU:8181/Text.exe?ergebnis=dom.GetObject("BidCos-RF.IEQ0049848:1.LEVEL").Value()
http://IPderCCU:8181/Text.exe?ergebnis=dom.GetObject("BidCos-RF.IEQ0049848:1.LEVEL").Level(0.0)
http://IPderCCU:8181/Text.exe?ergebnis=dom.GetObject("BidCos-RF.IEQ0049848:1.LEVEL").Value()
http://IPderCCU:8181/Text.exe?ergebnis=dom.GetObject("BidCos-RF.IEQ0049848:1.LEVEL").Level(1.0)
http://IPderCCU:8181/Text.exe?ergebnis=dom.GetObject("BidCos-RF.IEQ0049848:1.LEVEL").Value()
Das ist übrigens meiner Meinung nach die schnellste und übersichtlichste Methode, solche Anweisungen zu testen. Poste mir dann bitte die Rückgaben (<ergebnis>true</ergebnis>) über PN; der Thread hier würde sonst für andere wohl zu "technisch" und langatmig, sodass bald niemand mehr mitliest.

Solange "null" zurückkommt, ist die Anweisung nicht richtig. Dann musst du alle denkbaren Kombinationen und Varianten mit LEVEL, Value und State sowie Gross- und Kleinschreibung durchprobieren. Ich habe X Stunden vertrödelt, bis ich endlich herausgefunden hatte, dass man das "s" in BidCoS manchmal gross und manchmal klein schreiben muss! - Sogar in der gleichen Zeile! - Dafür darfst du vorne auch HomeMaticMist.exe schreiben, wenn dir das besser gefällt...

@all: Die positiven Reaktionen haben mich natürlich sehr gefreut. Auch ein weiterer Ausbau ist durchaus möglich. Solange das Projekt noch überschaubar ist, sollten aber vorerst allfällige Bugs ausgemerzt werden können. Dann habe ich an Dimmer (wenigstens EIN und AUS) und TFK (Garagetor!) gedacht. Temperaturen, Luftfeuchte, Wind usw. aber wohl kaum. Man kann das Tray-Icon ja nicht mit variablen Werten beschriften. Der Wert könnte also höchstens als Tool-Tipp beim Drüberfahren mit der Maus angezeigt werden. - Auch wollen wir ja jetzt nicht die gesamte Hausautomation in die Taskleiste verbannen... :P

Viele Grüsse
Bümpi

PeterM
Beiträge: 750
Registriert: 14.10.2008, 10:15
Wohnort: Walldorf/Baden

Re: TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Beitrag von PeterM » 31.01.2012, 12:36

Hallo buempi,

vielen Dank für dieses Tool!
Die allerbeste meiner Frauen (oder so ähnlich) ist überglücklich. Jetzt kann sie drucken wann immer sie will, ohne die Fernbedienung suchen zu müssen. :D

Viele Grüße,
Peter

Basic
Beiträge: 933
Registriert: 07.03.2010, 12:39
Wohnort: Deutschland

Re: TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Beitrag von Basic » 01.02.2012, 02:03

Anbei ein paar gebastelte Icons als zip.
Zwischenablage01.jpg
Dateianhänge
Icons.zip
(48.08 KiB) 290-mal heruntergeladen

buempi
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz

Re: TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Beitrag von buempi » 01.02.2012, 10:28

Hallo Basic

Toll! -Gut gemacht! - Vielen Dank! - Aber da kommt schon der nächste Wunsch: Mit dem Dimmer scheint's zu klappen! MaxWrestler hat auch noch geholfen. Auch Dank an ihn!

Dauert zwar noch etwas, bis das programmiert ist... aber dann bräuchten wird noch so 5 Lampen; AUS und EIN hast du schon gemacht. Jetzt noch 25% 50% 75% :roll:

Viele Grüsse
Bümpi

PS: Wenn's so klappt, wie ich es mir vorstelle, gibt's sogar einen Slider - wählbar horizontal oder vertikal

buempi
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz

Re: TrayMatic - Unterstützung für Dimmer/Rollläden eingebaut

Beitrag von buempi » 04.02.2012, 16:54

Hallo zusammen

So: Auch der Dimmer ist eingepflegt und von MaxWrestler sowie Sammy dankenswerterweise getestet. Ganz am Anfang des Threads kann die aktuelle Version "TrayMatic 1.1" heruntergeladen werden.

In der INI kann man nun bei Dimmern zusätzlich unterschiedliche Icons für folgende Zustände bestimmen:

00 (False), 01bis25, 26bis50, 51bis75 und 76 bis 100 (True)

Ferner gibt es (unten im INI-File) die Möglichkeit, einen horizontalen oder vertikalen Slider auszuwählen und die Länge dieses Sliders zu bestimmen.

Nach dem Start wird durch Klick auf das zugehörige Icon der Slider angezeigt. Sobald der Schieber mit der Maus verschoben wurde, wird der neu eingestellt Dimmer-Wert gesendet, und es erscheint ein entsprechender Hinweis. Hat man den Slider versehentlich angezeigt, kann er mit ESC wieder geschlossen werden, ohne dass eine Aktion erfolgt.

Ferner hat sich herausgestellt, dass es offenbar möglich ist, mit den gleichen Einstellungen wie beim Dimmer auch Rollläden zu steuern.

Das Gleiche gilt für Tür- und Fensterkontakte sowie ähnliche Auf-/Zu-Sensoren. Diese kann man als SchalterFunk oder SchalterWired in der INI definieren und kriegt so zuverlässig offene Fenster, Türen usw. angezeigt; "SchaltenErlaubt" sollte in diesem Fall deaktiviert werden.

Hier noch eine Kurzbeschreibung der unterstützten Typen:

Alle Typen

Die Icons für die verschiedenen Zustände (z.B. true/false) können in der INI frei definiert werden. Ferner kann man jedem Zustand einen Tool-Tipp zuordnen, der beim Überfahren des Icons in der Taskleiste angezeigt werden soll.

Über Rechtsklick auf das Icon kann das Programm beendigt werden.

Logische Systemvariablen / Schalter Funk und Wired

Der aktuelle Zustand (true/false) wird mit dem in der zugehörigen INI-Datei definierten Tray-Icon angezeigt. Ist in der INI-Datei die Option "SchaltenErlaubt" auf 1 gesetzt, kann durch Linksklick auf das Icon hin- und hergeschaltet werden.

Virtuelle Fernbedienungen Funk und Wired

Bei Klick auf das Icon wird ein Menü geöffnet, wo ausgewählt werden kann, ob ein kurzer oder langer Tastendruck simuliert werden soll.

Dimmer Funk und Wired / Rollläden Funk und Wired

Für Zwischenstellungen können in der INI-Datei neben 0% (false/Rollladen unten) und 100% (true/Rollladen oben) drei zusätzliche Icons bestimmt werden. Man kann auch bestimmen, ob man zum Verstellen einen horizontalen oder vertikalen Slider wünscht, und wie lang dieser sein soll. Klickt man auf das Icon, wird direkt beim Mauszeiger ein Slider angezeigt. Sobald der Schieber mit der Maus verschoben wurde, wird der neu eingestellt Dimmer-Wert (bzw. die Rollladen-Stellung) gesendet, und es erscheint ein entsprechender Hinweis. Hat man den Slider versehentlich angezeigt, kann er mit ESC wieder geschlossen werden, ohne dass eine Aktion erfolgt.

Das Icon und der Tool-Tipp werden erst nach Rückmeldung des Aktors dem aktuellen Zustand angepasst. Naturgemäss tritt bei diesen Modul-Typen eine entsprechende Verzögerung ein.

Tür- und Fensterkontakte, andere Auf-/Zu-Sensoren (Funk und Wired)

Diese können in der zugehörigen INI-Datei als "SchalterFunk" oder "SchalterWired" definiert werden. Zusätzlich sollte die Option "SchaltenErlaubt" auf 0 gesetzt werden. Die Zustands-Änderungen werden dann mit den in der INI definierten Icons für true und false und dem dort eingetragenen Text im Tool-Tipp angezeigt.


Die Tests konnten nur mit einer sehr begrenzten Anzahl unterschiedlicher Module durchgeführt werden. Es ist also durchaus möglich, dass das Programm nicht mit allen Geräten zurechtkommt. Auch lässt sich nicht ausschliessen, dass sich noch der eine oder andere Bug im Programm versteckt hat. - Dann bitte ich um Nachsicht!

Die neue Version funktioniert nicht mehr unter Windows 98!

Viele Grüsse
Bümpi

Basic
Beiträge: 933
Registriert: 07.03.2010, 12:39
Wohnort: Deutschland

Re: TrayMatic - HomeMatic aus dem Windows-Systray bedienen!

Beitrag von Basic » 06.02.2012, 00:54

Sammy hat geschrieben:ich hab das bisher über verknüpfungen in der Schnellstart-Leiste realisiert gehabt (Für jede Aktion ein separates Symbol)
Wie hast Du das gemacht? Kannst Du mal ein Beispiel posten?

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“