Lichtsteuerung durch Homestatus

Begonnen von grossmaggul, 12 Februar 2018, 10:56:44

Vorheriges Thema - Nächstes Thema

grossmaggul

Hallo,

ich habe ein kleines programmiertechnisches Problem, vielleicht kann mir ja jemand auf die Sprünge helfen.
In meinem Wohnzimmer werden verschiedene Lampen bei Dämmerung über das Twilight Modul eingeschaltet und Nachts zu einer bestimmten Zeit(1:00Uhr) ausgeschaltet.

Das Ganze habe ich mit dem Homestatus gekoppelt, ich habe einen Schalter in der Haustür, wenn ich abschließe werden die Lampen im Wohnzimmer ausgeschaltet und sollen wieder eingeschaltet werden, wenn die Haustüre aufgeschlossen wird. Aber eben nur dann, wenn es auch der Tageszeit entsprechend eingeschaltet gewesen wäre und da ist mein Problem.
Ich habe das folgendermaßen versucht zu lösen:
home_status:da set wz.light_on_sunset active ;
set wz.alle_lampen_aus active ;
{ if((time()<"01:00") && (ReadingsVal("zwielicht","light",undef) < 5))
{ fhem ("set wz.alle on");; }}

(wz.alle ist ein Dummy, der den on/off Status der Lampen enthält)

So wie es oben steht, funktioniert es nicht wie gewünscht, die Lampen werden zwar beim Verlassen des Hauses ausgeschaltet, aber nicht mehr eingeschaltet, wenn man wieder innerhalb des Zeitfensters "Dämmerung bis 1:00 Uhr" nach Hause kommt.
Ich vermute die Zeitfunktion stimmt nicht, da aber meine Programmierkenntnisse nur rudimentär ausgebildet sind weiß ich nicht wie ich das lösen kann.
Irgendjemand eine Idee?

grossmaggul
FHEM auf Debian 12 Bookworm Server, Supermicro Core2Duo Board, 2 TB HD RAID 1, 8GB RAM, 2 x nanoCUL868, 1 x nanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1,WLED

Prof. Dr. Peter Henning

#1
Nun, die beste Lösung wäre, seine "rudimentär ausgebildeten Programmierkenntnisse" zu erweitern. Wir sind nämlich damit auch nicht geboren worden und mussten das ebenfalls tun.

Tipp: http://wiki.selfhtml.org/wiki/Perl

LG

pah

grossmaggul

ZitatNun, die beste Lösung wäre, seine "rudimentär ausgebildeten Programmierkenntnisse" zu erweitern.
Die beste Lösung wäre gewesen, wenn es einem zuviel ist zu helfen, gar nix zu schreiben.

ZitatWir sind nämlich damit auch nicht geboren worden und mussten das ebenfalls tun.
Und natürlich hast Du das von heute auf morgen gelernt und das alles ganz alleine, toll!
Wenn man hier nur Hilfe bekommt, wenn man ein Perl-, HTML-, CSS-, Python-, Java-, Javscript-Crack ist, dann frage ich mich natürlich wofür dieses Forum dann gut sein soll.

Ich wollte übrigens keine Lösung auf dem Präsentierteller sondern hätte mir gewünscht, daß jemand mit besseren Programierkenntnissen als ich, mal schaut, wo da der Fehler liegen könnte.

FHEM auf Debian 12 Bookworm Server, Supermicro Core2Duo Board, 2 TB HD RAID 1, 8GB RAM, 2 x nanoCUL868, 1 x nanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1,WLED

Otto123

#3
Hi,

Du müsstest als erstes noch dazu sagen was Dein Code eigentlich ist. Dazu ist ein list prinzipiell am Besten, da sieht man am meisten. So ein Stück Programmcode, da muss man zuviel raten.
Das ist ein notify? Der trigger ist home_status:da der Event also da? Kommt den der Event wenn Du gehst und wenn Du kommst?

Ein notify macht genau eine Aktion beim trigger, Du spulst also eine Reihe von Befehlen ab. Soll das nur fürs einschalten sein?

Was gibt Dir ein {time()}in der FHEM Kommandozeile zurück? Beantwortet das Deine letzte Frage?

Schau mal hier, welche Zeit Variablen/Funktionen Dir FHEM zur Verfügung stellt.
Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Prof. Dr. Peter Henning

Zitatwofür dieses Forum dann gut sein soll
Sicher nicht dafür, elementare algorithmische Kenntnisse zu vermitteln. Denn dass
Zitattime()<"01:00"
nichts Sinnvolles ist, erkennt man dann schon selbst.

Im Übrigen war der Tipp ernst gemeint - sonst landet jede Codezeile wieder als "kleines programmtechnisches Problem" wieder hier im Forum.

Also locker bleiben und wirklich mal ein paar Seiten lesen.

pah

grossmaggul

Danke Otto,

für Deine Antwort!
Sorry, das hatte ich vergessen, es ist ein notify und ist nur für's einschalten zuständig.

Danke für den Link, das schaue ich mir mal an.

ZitatBeantwortet das Deine letzte Frage?
Ja.

ZitatDazu ist ein list prinzipiell am Besten, da sieht man am meisten.
Auch wenn dem Herrn Professor jetzt alle Haare und Zähne ausfallen, ich habe keine Ahnung wie man das macht, aber ich werde mal suchen.


FHEM auf Debian 12 Bookworm Server, Supermicro Core2Duo Board, 2 TB HD RAID 1, 8GB RAM, 2 x nanoCUL868, 1 x nanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1,WLED

Prof. Dr. Peter Henning

ZitatAuch wenn dem Herrn Professor jetzt alle Haare und Zähne ausfallen
Da überschätzt aber jemand seine Bedeutung bei weitem.

Noch ein Tipp: CommandRef lesen.

pah

grossmaggul

ZitatNoch ein Tipp: CommandRef lesen.
Noch ein Tipp, Arroganz runterschrauben.
FHEM auf Debian 12 Bookworm Server, Supermicro Core2Duo Board, 2 TB HD RAID 1, 8GB RAM, 2 x nanoCUL868, 1 x nanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1,WLED

binford6000

ZitatIrgendjemand eine Idee?
Ich hätte da noch eine. Schau mal hier rein:
https://forum.fhem.de/index.php/topic,76660.msg685655.html#msg685655
isInTime('18:00-22:00')
leistet bei mir treue Dienste. Gibts auch für eine Datumsabfrage im gleichen Thread.
VG Sebastian

CoolTux

Zitat von: binford6000 am 12 Februar 2018, 18:58:38
Ich hätte da noch eine. Schau mal hier rein:
https://forum.fhem.de/index.php/topic,76660.msg685655.html#msg685655
isInTime('18:00-22:00')
leistet bei mir treue Dienste. Gibts auch für eine Datumsabfrage im gleichen Thread.
VG Sebastian
In der Regel befürworte ich solche Tips sehr. Allerding scheint es dem Threadersteller noch am rudimentären Wissen zu mangeln. Daher werden hier weitere Fragen nicht lange auf sich warten lassen.


home_status:da set wz.light_on_sunset active ;
set wz.alle_lampen_aus active ;
{ if((time()<"01:00") && (ReadingsVal("zwielicht","light",undef) < 5))
{ fhem ("set wz.alle on");; }}

Das hier stimmt vorn und hinten nicht. Bitte eigene Dir Wissen zum Thema Notify an.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

binford6000

ZitatAllerding scheint es dem Threadersteller noch am rudimentären Wissen zu mangeln. Daher werden hier weitere Fragen nicht lange auf sich warten lassen.
Das stimmt wohl. Wie Otto bereits geschrieben hat, würden die lists der devices helfen...  ;)
VG Sebastian

Otto123

list ist sehr vielfältig, vor allem wenn man es mit anderen Dingen kombiniert, z.B. devspec. Damit wird es quasi die Suche in Deinem FHEM.
probiere mal diesen Befehl in der FHEM Kommandozeile.
list TYPE=notify
Da dürfte dein notify auch auftauchen. Dann nimmst Du den Namen Deines notify und schreibst ihn hinter das list. Die Ausgabe die da kommt mögen hier alle am liebsten als Info.  :D

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Prof. Dr. Peter Henning

#12
Manche Leute haben einfach zu viele Buchstaben im Pseudonym.


*gg*


pah

grossmaggul

Erstmal danke für die Antworten.

Um das mal klar zu stellen, ich habe schon einiges gelesen, auch in der commandref, ich finde es aber nachwievor schwierig, das alles unter einen Hut zu bekommen und die Zusammenhänge herzustellen. Und es braucht halt Zeit, da durch zu steigen, die ich aber nicht immer habe und es soll auch Leute geben, die solche komplexen Dinge nicht so schnell durchblicken.

Wenn mir jemand so etwas schreibt: "Das hier stimmt vorn und hinten nicht. " Dann wäre es nett, wenn man dann auch schreibt, was da vorne und hinten nicht stimmt und nicht darauf hinweist sich notify Wissen anzueignen, denn ich war eigentlich der Meinung, daß ich das habe.
Denn wenn ich in der commandref zu notify lese:
"Führt eine oder mehrere Anweisungen aus, wenn ein Event generiert wurde, was dem <Suchmuster> (Gerätename oder Gerätename:Event) entspricht."

Dann ist es zumindest aus meiner Sicht genau das, was mein notify macht: "Wenn das Event "da" eintritt werden verschiedene Anweisungen ausgeführt."

Ich danke Otto für seine Geduld und für alle die es noch interessiert so sieht das Listing aus:

ZitatInternals:
   DEF        home_status:da set wz.light_on_sunset active ; set wz.alle_lampen_aus active ;
{ if((time()<"00:15") && (ReadingsVal("zwielicht","light",undef) < 5)) { fhem ("set wz.alle on");; }}
   NAME       da
   NOTIFYDEV  home_status
   NR         56
   NTFY_ORDER 50-da
   REGEXP     home_status:da
   STATE      2018-02-12 16:12:40
   TYPE       notify
   READINGS:
     2018-02-12 10:38:28   state           active
Attributes:
   room       9.6_HomeStatus
   verbose    3
FHEM auf Debian 12 Bookworm Server, Supermicro Core2Duo Board, 2 TB HD RAID 1, 8GB RAM, 2 x nanoCUL868, 1 x nanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1,WLED

CoolTux

Ok fangen wir mit dem einfachsten an.
Jeder noch so nicht funktionierende Mist wird in FHEM in einem Logfile ausgeworfen. Sowas nennt man Fehlermeldung. Da kannst Du Mal schauen und hier angeben.
Als zweites hast Du in Deinem Notify Devices stehen die Du schaltest welche du hier als list Info mit angeben solltest.

Nun zum wichtigen. Dein Beispielcode scheint direkt aus der Konfig zu sein. Es empfiehlt sich immer über das FHEMWEB zu arbeiten. Unter den Details zum Notify einfach auf DEF drücken. Da bekommst du eine Syntaxprüfung Deines Codes.

Unter FHEM gibt es FHEM Befehle, wenn das nicht reicht kann man Perlcode verwenden. Beides zu mischen ist nicht gut, daher sagt man sofern man auch nur ein bisschen Perlcode verwendet geht man und bleibt man in der Perlebene. Das macht man mit { }

Du solltest also alle Deine fhem Befehle in Perl schreiben.


home_status:da {
  fhem("set wz.light_on_sunset,wz.alle_lampen_aus active");
  if( (time()<"00:15") && (ReadingsVal("zwielicht","light",undef) < 5)) {
         fhem ("set wz.alle on");
    }
}


Natürlich stimmt der Zeitenvergleich noch lange nicht. Tip: im Notify stehen Dir die globalen Variablen $hour und $min zur Verfügung.
Ansonsten gebe ich Paar Recht, sobald Du mehr machen möchtest wie einfache Schaltvorgänge lohnt es sich Perlwissen an zu eignen.

Über das Konstrukt was Du da warum schaltest lass ich mich jetzt nicht aus. Sieht so aus als aktivierst Du weitere Notifys


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net