Willkommen › Foren › LogoControl › FHEM und logocontroll
Verschlagwortet: FHEM logocontrol analog
- Dieses Thema hat 5 Antworten sowie 3 Stimmen und wurde zuletzt vor vor 8 Jahren, 8 Monaten von admin aktualisiert.
-
AutorBeiträge
-
15. Oktober 2015 um 11:57 #2492Florian_STeilnehmer
Hallo erstmal 😉 ,
Also ich habe das Problem das ich logocontrol und FHEM zusammen auf meinem RPI2 laufen habe, beides scheint auch zu funktionieren (wobei ich das bei FHEM noch nicht mit voller Garantie sagen kann) und nun wollte ich beides koppeln.
Die Idee war bzw ist immer noch Nachts die Beleuchtung die sonst komplett über die LOGOs läuft von den Bewegungsmeldern steuern zu lassen. Ich habe zuerst einmal wie im Artikel beschrieben FHEM angepasst indem ich den notify hinzugefügt habe und meinem Bewegungsmelder das comment hinzugefügt habe. Anschließend habe ich die neue 99… Datei angelegt. Soweit hat auch erstmal alles funktioniert nur bin ich mittlerweile mir nicht mehr sicher ob die logocontrol config auch passt ich möchte lediglich das der Sensor einen Impuls an die Logo sendet weiß aber nicht wie der Code richtig ist es wäre nett wenn ich ein Beispiel bekommen könnte da mich das Beispiel mit der Steckdose zu guter Letzt nur noch verwirrt hat.MFG
15. Oktober 2015 um 13:42 #2493adminAdministratorHi Florian,
ist das ein Bewegungsmelder vom Homematic-Sytem? Ich selbst habe aktuell nur die Funksteckdosen, sowie die Fensterkontakte davon im Einsatz. Dafür passt auch das FHEM-Perl-Skript. Es kann daher gut sein, dass du an dem Perl-Skript für deine Zwecke die ein oder andere Anpassung machen musst. Dazu ein paar Hintergründe zur Funktionsweise des Skripts:
Dein Bewegungsmelder ist ein ziemlich einfacher Anwendungsfall, da ja nur Informationen von FHEM zu LogoControl übertragen werden müssen und nicht wie bei der Funksteckdose in beide Richtungen. Generell funktioniert das aktuell so, dass FHEM mit dem universellen notify alle Events aller Geräte die mit HM_ beginnen abfängt und in der benutzerdefinierten 99_logoUtils.pm behandelt werden. Diese schaut dann ob im „comment“ des Geräts ein „LogoStateAddress=“ steht. Ist dies der Fall wird abhängig vom neuen Zustand des Geräts bei „on“ oder „open“ die LogoControl-Url http://localhost:8088/rest/bytes/$1/bits/$2?set=1 und bei „off“ oder „closed“ die Url http://localhost:8088/rest/bytes/$1/bits/$2?set=0 aufgerufen. Dieser spezielle Rest-Aufruf schreibt direkt in den VM-Speicher der Logo. Das heißt es muss in LogoControl nichts konfiguriert (kein Device/Attribut angelegt) werden, der Wert kann dann direkt über einen Netzwerkeingang in dein Schaltprogramm einbezogen werden. Das einzige was du nun machen müsstest, ist, das Perl-Skript soweit anzupassen, dass es auch die Zustände des Bewegungsmelders unterstützt. Schau mal ins Log was der Bewegungsmelder so alles an Events liefert. Soweit ich nach kurzer Recherche herausgefunden habe schickt er bei Bewegung ein „motion“ Event, da könntest du das Bit im Logo-VM auf 1 setzen. Die Frage ist, wie du es nach einiger Zeit nicht erkannter Bewegung wieder zurück auf 0 setzen um ein erneutes auslösen detektieren zu können?! Evtl. einen Timer in FHEM definieren, aber da kenne ich mich mit FHEM zu wenig aus…
Alternativ fällt mir noch die Möglichkeit ein in LogoControl ein Dummy-Device für den Bewegungsmelder mit einer Methode „Motion Detected“ anzulegen und diese Methode mit einem einfachen HTTP-Get „http://localhost:8088/rest/devices/1/methods/1“ beim FHEM „motion“ event aufzurufen. Methoden setzen das Bit in der Logo ja nur für 250ms auf 1, so dass eine erneute Auslösung des BM dann kein Problem mehr wäre. Schau mal, ob du mit diesen Infos weiterkommst, ansonsten melde dich nochmal…
Viele Grüße,
Tobias17. Oktober 2015 um 21:51 #2500Florian_STeilnehmerHallo Tobias,
deine Erklärung hat mich schon weiter gebracht, das schalten funktioniert jetzt, nun verzweifel ich am zurücksetzten, da der Sensor (Homematic Bewegungsmelder) immer motion ausgibt. Dies stellt im Prinzip kein Problem dar, nur müsste ich die URL die ja eine 1 schreibt vom Code her so ändern, dass die URL nur für 1s die 1 schreibt. Das gibt der LOGO genug Zeit zum reagieren und der Sensor tut das was er soll. Leider weiss ich nicht wie man einer URL einen Zeitbefehl mitgibt. Vielleicht hast du ja eine Idee wie ich deinem Code die Zeitvariable hinzufügen kann.
MFG
19. Oktober 2015 um 15:02 #2504adminAdministratorAlso mit dem Timer kann ich dir nicht weiterhelfen. Ich würde Option 2 wählen und eine LogoControl-Methode (für die du vorher natürlich ein Dummy Device „Bewegungsmelder“ anlegen musst) aufrufen. Dann hast du das Signal für 250ms in der Logo und kannst damit machen was du willst. Dazu kannst du das Perl-Skript wie folgt ändern (hab das Skript aber nicht getestet!):
package main; use strict; use warnings; use POSIX; sub myUtils_Initialize($$) { my ($hash) = @_; } ########################################################## # LogoControl Notify Handler # sub SetLogoControlState($) { my ($obj) = @_; my $comment = AttrVal($obj,"comment",""); if ($comment =~ /LogoStateAddress=(\d+)\.(\d)/ ){ my $url = "http://localhost:8088/rest/bytes/$1/bits/$2"; if (Value($obj) eq "on" || Value($obj) eq "open"){ GetFileFromURL($url."?set=1" ); } elsif (Value($obj) eq "off" || Value($obj) eq "closed"){ GetFileFromURL($url."?set=0" ); } } elsif ($comment =~ /LogoDeviceMethod=(\d+)\.(\d)/ ) { my $url = "http://localhost:8088/rest/devices/$1/methods/$2"; if (Value($obj) eq "motion"){ GetFileFromURL($url); } } return, } 1;
Als „Comment“ gibst du bei deinem FHEM-Gerät dann nicht „LogoStateAddress…“ sondern „LogoDeviceMethod=deviceId.methodId“ an, z.B. „LogoDeviceMethod=5.1“ für Device=5 und Method=1.
23. April 2016 um 0:32 #2851magconTeilnehmerHallo!
Meine Herausforderung besteht darin, dass ich analoge Werte (Format WORD) von FHEM via logocontrol zur LOGO8 schreiben möchte. Versuche in verschiedene Richtungen scheiterten bisher. Die leider nicht funktionierende, mir am attraktivsten erscheinende Variante lautet wie folgt:
package main; use strict; use warnings; use POSIX; sub myUtils_Initialize($$) { my ($hash) = @_; } ########################################################## # LogoControl Notify Handler # sub SetLogoControlState($) { my ($obj) = @_; my $comment = AttrVal($obj,"comment",""); if ($comment =~ /LogoStateAddress=(\d+)\.(\d)/ ){ my $url = "http://localhost:8088/rest/bytes/$1/bits/$2"; if (Value($obj) eq "on" || Value($obj) eq "open"){ GetFileFromURL($url."?set=1" ); } elsif (Value($obj) eq "off" || Value($obj) eq "closed"){ GetFileFromURL($url."?set=0" ); } } elsif ($comment =~ /LogoDeviceAttribut=(\d+)\.(\d)/ ){ my $url = "http://localhost:8088/rest/devices/$1/attributes/$2"; if (Value($obj) gt "-50"){ GetFileFromURL($url."value?set=Value($obj)" ); } } return, } 1;
Mit dem if-Bedingung und dem Vergleich, dass der Wert grösser als -50 sein soll, sollte nur den einen Hintergrund haben: Pseudetrigger.
Kann mir jemand helfen?Grüsse MM
25. April 2016 um 15:55 #2855adminAdministratorHi,
das mit dem Analogwert in ein LogoControl Attribut zu schreiben ist auf jeden Fall schon mal eine gute Idee. Zum Setzen eines Attributs in LogoControl muss folgender REST-Aufruf getätigt werden:
http://localhost:8088/rest/devices/47/attributes/1/value?set=100
In deiner URL fehlt dazu hinten auf jeden Fall noch ein Slash (/) nach dem $2 da die url später direkt mit dem
value?set...
zusammengesetzt wird. Außerdem dürfte das mit dem$url."value?set=Value($obj)"
nicht funktionieren , da du die FunktionValue()
innerhalb des Strings benutzt und somit nicht als Funktion ausgewertet wird. Bin absolut kein Perl-Experte (und auch kein Perl-Fan :-)) aber versuch mal folgendes:GetFileFromURL($url."value?set=".Value($obj) );
-
AutorBeiträge
- Du musst angemeldet sein, um zu diesem Thema eine Antwort verfassen zu können.