Twilight als Schaltzeitpunkt

Begonnen von patlabor, 02 Juni 2014, 21:04:48

Vorheriges Thema - Nächstes Thema

patlabor

Hallo zusammen,

versuche gerade erfolglos meine Wohnzimmerbeleuchtung über Twilight zu steuern.
Hatte das ganze auch über Twilight_Weather fast hinbekommen nur habe ich nach ein paar Tagen gemerkt, das Morgens das Licht auch angeht  und das notify wurde extrem komplex bis ich schlieslich komplett die übersicht verloren habe.

Jetzt bin ich in der commandref über die Funktion twilight gestolpert und wollte mir damit ein einfaches at zusammenschußtern.

Momentan sieht das so aus:

define wz_abendlicht at *{twilight("sonnenstand","ss_weather","00:01","23:59")} if ([Bewohner] eq "home" and [Bewohner] ne "asleep") (set wz_schrank on)

Das schien auch gestern recht gut zu funktionieren. Jetzt sollte es heute das erste mal zeigen ob es wirklich funktioniert und siehe da, es geht nicht.

Twilight hat 20:39 als ss_weather angegeben und das Licht war aus, kurz nach Acht ist ein Gewitter aufgezogen und ss_weather ist auf 19:52 Uhr gewandert. Also blieb das Licht auch aus, da der Zeitpunkt zum auslösen schon vorbei war.

1. Wie stelle ich sowas denn an damit das auch zuverlässig funktioniert?

2. Laut commandref sind die Angaben von min und max Zeit bei twilight optional, lasse ich diese aber weg, erhalte ich die Fehlermeldung das Parameter fehlen.

3. Wie bekomme ich eigentlich in fhem meine definitionen getestet? Irgendwie ist es ziemlich umständlich solche Schaltanweisungen nur einmal täglich zu einer Bestimmten Zeit testen zu können. "Jetzt ist Sonnenuntergang, eigentlich sollte gleich was passieren, wenn nicht, muss ich nachbessern und dann bis morgen warten ob es jetzt funktioniert" Der WAF von "Spielereinen" wie fhem ist ja grundsätzlich schon ziemlich niedrig, wenn es dann aber Wochen lang dauert bis etwas funktioniert, und man(n) pünktlich zum Sonnen- auf/untergang am Rechner sitzen "muss" geht er fast gegen null, wenn nicht sogar ins negative.

Dietmar63

define wz_abendlicht at *{twilight("sonnenstand","ss_weather","00:01","23:59")} if ([Bewohner] eq "home" and [Bewohner] ne "asleep") (set wz_schrank on)

Du bringst leider vieles durcheinander. Der Ansatz kann nicht funktionierten, da
1) twilight() in einem at immer mit dem Wert des Vortags ausgewertet wird.
2) if ([Bewohner] eq ... ist so etwas wie eine Mischung zwischen if aus Perl und dem IF-fhem-Befehl von Damian.
- [...]  ist IF.
- and ist auch IF, aber
- if ist Perl - man kann beides nicht einfach so mischen, für IF ist Damian der Experte - alles verstanden???
3) vermutlich bekommst du bei der Ausführung des Befehls (nach dem at) einen Fehler, der aber im fhem-Universum untergeht. Helfen kann nur die Auslagerung des Codes in die 99_utils - dann bekommst du bessere Fehlermeldungen, und glaub mir, dein Code ist nicht übersetzbar, weil weder fehlerfreies Perl noch fehlerfreies IF(Damian). 

bei mir funktioniert es so:
define TwilightMessage1       notify Twilight.*:aktEvent:.*ss_weather.*      set StehlampeTisch on
Du müßtest es so ändern:
define TwilightMessage1       notify Twilight.*:aktEvent:.*ss_weather.*      {fhem("set StehlampeTisch on") if (...);

Beim if musst  du dich für if(Perl) oder IF (Damian) entscheiden - mit twilight() hat das leider alles wenig zu tun.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Elektrolurch

Noch ergänzende Tipps:

1. Wenn Du den Code in die 99_myUtils auslagerst, kannst Du die Subroutine zum Test auch von der fhem-Command line aufrufen:
{meine_sub('wert',...5);;}
und in die subroutine auch Ausgaben in slog schreiben:
Log(3,"Hier komme ich vorbei");

Auch kannst Du über die commandline Werte abfragen:
{Value('meineLampe');;}
{ReadingsVal('Wetter','twilight_wc','nicht gefunhden');;]}

Dann sieh Dir mal in der Doku den Befehl "trigger" an, mit dem kannst Du an ein fhem-Objekt Werte senden.

Diese kleinen nützlichen Tipps hat mir am Anfang auch niemand gesagt, klar - irgendwo stehen die auch in der Doku, bei der Masse an Infos überliest man das aber am Anfang.

So, hoffe, dass das Dir weiterhilft.

Gruß

Elektrolurch
configDB und Windows befreite Zone!

patlabor

Hallo,

erstmal danke für die schnelle Hilfe, werde mal deinen Vorschlag versuchen.

Was mich etwas verwirrt, ist die Tatsache das die von mir angegebenen if schleifen eigentlich überall genau so funktionieren, nur hatte ich vorher den "twilight_weather" Wert als Auslöser benutzt.

if ([sonnenstand:twilight_weather] < "45") (set wz_schrank on-till 23:45)
(oder so ähnlich, habe momentan weder zugriff auf meine fhem instanz noch die Musse in der commandref genau nachzuschlagen.)

nur ist dann die lampe nach 23:45 wieder angegangen da twilight_weather ja immernoch kleiner 45 war.

benutzte if genau so auch an anderen stellen, und dort funktionert er auch so.

mit sicherheit hast du recht und ich habe irgendwo einen fehler drin, aber ich sehe ihn nicht und sehe auch keinen unterschied zu meinen funktionierendem code.

in deiner lösung taucht auch wieder dieses "ominöse" aktEvent auf, das habe ich schon öfter im zusammenhang mit twilight gesehen kann aber irgendie nirgends erkennen für was das eigentlich ist oder wo es herkommt. evtl. würde es mir helfen wenn ich wüsste WARUM das an diese stelle kommt.

Auslagern in 99_myUtils: ich habe nicht geringste ahnung was das schon wieder ist, habe das bisher so verstande, das ich dort meine eigenen Perl programme reinschreiben kann, aber leider kann ich da nicht mehr folgen und auch deine beispiele ergeben für mich so leider keinen sinn. hier fehlen mir einfach komplett die kompletten grundlagen. keine ahung was dieses meine_sub ist oder warum da DREI punkte hinter das komma müssen.

aber wenigstens habe ich trigger jetzt glaube ich verstanden. ich habe das vorher nie wirklich umgesetzt bekommen. ich habe mir z.b. mit
define test at *11:00 set lampe on
etwas gebastelt und micht dann gewundert warum bei
trigger test
nichts passiert

Dietmar63

if ([sonnenstand:twilight_weather] < "45") (set wz_schrank on-till 23:45)
kann nur so richtig sein:
IF ([sonnenstand:twilight_weather] < "45") (set wz_schrank on-till 23:45)
GROSSES IF - dann handelt es sich nicht um Perl sondern um Damians IF-fhem-Befehl. Der ist zwar vielleicht einfacher zu begreifen/benutzen als if(PERL) aber auch sehr verwirrend, weil doppelt und ...
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

patlabor

OK, wenn die gross/Kleinschreibung eine rolle spielt, kann das sehr gut sein. Darauf habe ich nicht geachtet.bin halt unter Windows und im Internet groß geworden , da spielt groß/klein ja keine Rolle

Gesendet von meinem Galaxy Nexus mit Tapatalk


patlabor

Irgendwie ist hier immernoch ein Wurm drin.
Nachdem es mit Bedingungen partout nicht funktionieren wollte habe ich alle bedingungen Rausgeschmissen und momentan einfach ein
define licht notify Twilight.*:aktEvent:.*ss_weather.* set wz_schrank on

gesetzt und versucht ihn mit
trigger sonnenstand ss_weather
auszulösen.
Aber wie jedesmal wenn ich trigger benutze passiert überhaupt nichts.
im Event log taucht zumindest ein
Twilight sonnenstand ss_weather
auf, aber das Licht bleibt stur aus.

Dietmar63

define licht notify sonnenstand.*:aktEvent:.*ss_weather.* set wz_schrank on
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

patlabor

Zitat von: Dietmar63 am 03 Juni 2014, 16:41:32
define licht notify sonnenstand.*:aktEvent:.*ss_weather.* set wz_schrank on

hat leider auch nichts gebracht, Licht bleibt aus.

Dietmar63

Warte mal ab, ob der notify nachher schaltet.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm