Steuerung Lampe-TV bräuchte mal nen schubs in die richtige... (gelöst)

Begonnen von stadtkind, 22 November 2015, 14:02:40

Vorheriges Thema - Nächstes Thema

stadtkind

hallo, ich habe in meinem Wohnzimmer zwei lampen ,sagen wir einfach mal lampe a und lampe b, jeden tag zu Sonnenuntergang möchte ich eine der beiden einschalten lassen. geht das irgendwie zufällig oder nur fest definiert?
zusätzlich soll dann aber falls lampe b eingeschaltet wurde diese aus- und lampe a angeschaltet werden sobald der Fernseher (philipsTV) eingeschaltet wird, um 23:00uhr soll dann die Beleuchtung gelöscht werden....

wie kann ich das am besten realisieren? ist das erste mal das ich mich an so eine etwas komplexere Steuerung wage...
wäre sehr dankbar wenn mich jemand in die richtige Richtung schubsen könnte oder auch eine konkrete lösung vorschlägt...

mfg stadtkind

yrwyddfa

Ich bin leider auch noch viel zu sehr Noob, als dass ich Dir einen fertigen Code präsentieren könnte, aber vielleicht kommen wir ja zusammen drauf.

Erst mal brauchen wir einen Zufallsgenerator (an dem beiß ich mir derzeit auch noch die Zähne aus, vielleicht kann uns hier jemand noch weiter helfen?)
Der sollte zufällig einen Zustand "0", Zustand "1" und Zustand "2" auswählen. Wobei "0" inaktiv bedeutet, "1" z.B. Lampe_a:on und Lampe_b:off bedeutet und "1" dann Lampe_a:off und Lampe_b:on, und zwar jedes mal bei Sonnenuntergang.



Jetzt könnten wir mit doif weiterarbeiten nach dem Stile:
define Zufallsgenerator DOIF *wenn [Sonnenuntergang bis 23:00 Uhr], setze Zufallsgenerator auf 1 oder 2* DOELSE (set Zufallsgenerator eq 0)
Einen Zufallswert generieren, der  zwischen Sonnenuntergang und 23 Uhr auf 1 oder 2 sitzt.

define doif_Zufallslampe DOIF (Zufallsgenerator eq 1) (set Lampe_a on) DOELSIF (Zufallsgenerator eq 2) (set Lampe_b on)

Je nach Wert des Zufallsgenerator Lampe A oder B schalten.

define doif_Lampenswitch DOIF (Lampe_a eq on and Phillips_TV eq on) (set Lampe_a:off ;; set Lampe_b:on ;; sleep 43200) DOELSIF (Lampe_b eq on and Phillips_TV eq on) (set Lampe_b:off ;; set Lampe_a:on ;; sleep 43200)
Wenn Lampe A und Fernseher an ist, schalte Lampe A aus und Lampe B an, dann schlafe 12 Stunden (damit er nicht irgendwann bei einer Filmnacht die Abfrage noch mal macht und plötzlich das Licht wieder wechselt). Weiterhin, wenn Lampe B und Fernseher an sind, Schalte A an und B aus, dann schlafe 12 Stunden.

define n_Lichtaus notify at *23:00 set Lampe_a,Lampe_b off
Schlate nach 23 Uhr beide Lampen aus.

Ich bin leider noch nicht so codesicher und es muss sicherlich noch mal überdacht werden, aber vielleicht reicht es zum drauf aufbauen?
If every day has its number, Monday would be a zero division.

stadtkind

#2
so hab mal nen bisschen gegoogelt....

[/define Zufall at *{sunset("REAL",0)} {\
                 my §ZufallsLampe = int(rand(1,2));;\
                 fhem("define Lampe.Zufall.an DOIF ([ZufallsLampe] eq "1") (set lampe.a on) DOELSE (set lampe.b on)


wenn ich es richtig verstanden habe sollte so jeden tag bei Sonnenuntergang eine zufallszahl zwischen 1 und 2 generiert werden und davon abhängig lampe a oder lampe b eingeschaltet werden...

kann das jemand bestätigen oder mir sagen das ist falsch , das musst du so machen?

später ausschalten ist einfach...

define Lampe.Zufall.aus at 23:00:00 set lampe.a,lampe.b off

damit wären die lampen dann aus.

Falls das so alles richtig ist würde dann ja nur noch was fehlen um von lampe b auf lampe a zuschalten wenn der Fernseher angeschaltet wird.



Paul

Ich nehme mal an dein Fernseher ist lan fähig dann kannst du das mit dem Presence-Modul lösen
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

stadtkind

Das schau ich mir mal an... und sonst, meinst du, das haut so hin?

Prof. Dr. Peter Henning

Das wird so eher nichts ...

1. Welche möglichen Zustände hat das System ?
2. Welche Aktionen/Externe Events gibt es, die den Zustand ändern ?
3. Event-Handler (DOIF oder notify) schreiben, die auf diese Events warten und die Zustandsänderung auslösen.

LG

pah

stadtkind

funktioniert alles nicht :'(
habs jetzt nochmal anders probiert:

define Lampe.Zufall dummy
           define Timer.Zufall at *00:01 set Lampe.Zufall {(int(rand(2))}


aber leider setzt er den dummy dann auf " {(int(rand(2))} " und nicht auf 0 oder 1....

weiss jemand was ich falsch mache?

Damian

#7
Zitat von: stadtkind am 23 November 2015, 20:03:15
funktioniert alles nicht :'(
habs jetzt nochmal anders probiert:

define Lampe.Zufall dummy
           define Timer.Zufall at *00:01 set Lampe.Zufall {(int(rand(2))}


aber leider setzt er den dummy dann auf " {(int(rand(2))} " und nicht auf 0 oder 1....

weiss jemand was ich falsch mache?

Hier mal was Konkretes ohne TV für den Anfang:

define di_lampe DOIF ([{sunset("REAL",0)}-23:00])
  (IF (int(rand(2))) (set lampe_A on) ELSE (set lampe_B on))
DOELSE
  (set lampe_A:FILTER=STATE!=off off, set lampe_B:FILTER=STATE!=off off)


Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

stadtkind


Damian

Zitat von: stadtkind am 23 November 2015, 20:29:36
Kannst du mir das noch kurz erklären?

DOIF kennst du schon

[{sunset("REAL",0)}-23:00] ist ein Zeitintervall

(IF (int(rand(2))) (set lampe_A on) ELSE (set lampe_B on)) Bei ungleich Null (hier eins) Lampe A einschalten, sonst Lampe B.

(set lampe_A:FILTER=STATE!=off off, set lampe_B:FILTER=STATE!=off off) um 23:00 Uhr (Ende des Zeitintervalls) Lampe ausschalten, die an war.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

stadtkind

Ok... Danke, das hab ich glaube ich soweit verstanden...

hast du auch noch einen Tipp wie ich den Fernseher da mit rein bringe?  Brauche ich dafür ein notify? Kann man das da dann nicht gleich mit einbauen?

Vize

Zitat von: stadtkind am 22 November 2015, 14:02:40und lampe a angeschaltet werden sobald der Fernseher (philipsTV) eingeschaltet wird, um 23:00uhr soll dann die Beleuchtung gelöscht werden....

N'Abend,

zu der Sache kann ich dir bezüglich des Vorschlages von Paul zeigen, wie ich das gelöst habe:

Als erstes einen dummy mit PRESENCE gebaut, der über LAN alle 60 Sekunden den Fernseher "abfragt"
define TV PRESENCE lan-ping IP.DES.FERN.SEHERS 60

Dann noch ein DOIF, welches den Zustand des dummies abfragt und das Licht einschaltet
define lampe_an_tv DOIF ([TV:state] eq "present") (set lampe on) DOELSE (set lampe off)

Mit den Hinweisen von Damian kannst du dann noch die Abschaltung der Lampe(n) bei 23:00 Uhr erzwingen.

Vielleicht hilft das dir ja ein bischen...

Gruß
Andreas

stadtkind

Vielen dank Andreas...
Aber das Licht soll ja nicht angeschaltet werden, sondern wenn der tv eingeschaltet wird und Lampe.b angeschaltet ist soll diese ausgeschaltet und Lampe.a eingeschaltet werden, und zwar nur in dieser Kombination und nur in der angegebenen Zeit.

Vize

Moin,

aber du schreibst doch:
"zusätzlich soll dann aber falls lampe b eingeschaltet wurde diese aus- und lampe a angeschaltet werden sobald der Fernseher (philipsTV) eingeschaltet wird

Genau das macht mein Vorschlag mit dem DOIF mit lampe a, darin steht halt nu lampe und nicht lampe a.
Den Rest musst du natürlich noch an deine Gegenbenheiten anpassen (Zeiten und lampe b aus), aber die entsprechenden Tipps hast du ja auch schon bekommen...

Gruß
Andreas

stadtkind

#14
so klappt jetzt alles....

                   vielen dank für die hilfe....

define Lampe.Zufall DOIF ([{sunset("REAL",0)}-23:00])
  (IF (int(rand(2))) (set Lampe.a on) ELSE (set Lampe.b on))
DOELSE
(set Lampe.a:FILTER=STATE!=off off, set Lampe.b:FILTER=STATE!=off off)

define Lampe.wechseln DOIF ([{sunset("REAL",0)}-23:00] and [PhilipsTV:presence] eq "present" and [Lampe.b] eq "An") (set Lampe.a on, set Lampe.b off)