Hue steuern per 99_myUtils.pm

Begonnen von Superposchi, 11 September 2021, 17:26:20

Vorheriges Thema - Nächstes Thema

Superposchi

Hallo ich habe mir folgendes Script für meine 99_MyUtils.pm geschrieben um beim Zu Bett gehen alle Lichter auszuschalten.
sub Nachtschaltung
{
# Dummy aktivieen
fhem("set lichtabschaltung aktiv");

# Balkon und Küche
fhem("set plug_ba_wandlicht off");
fhem("set light_ku_deckenlicht off");
fhem("set light_ku_schrankunterbaulicht off");

# Wohnzimmerlichter
fhem("sleep 5");
fhem("set switch_wz_deckenlicht off");
fhem("set light_wz_fensterbanklicht off");
fhem("sleep 5");
fhem("set light_wz_wandlampe_rechts off");
fhem("sleep 1");
fhem("set light_wz_wandlampe_links off");
fhem("sleep 5");
fhem("set plug_wz_sideboard off");

# Schlafzimmerbeleuchtung
fhem("set light_sz_computerlicht off");
fhem("set light_sz_buchregeallicht off");
fhem("set light_sz_deckenlicht_sportregal off");
fhem("set light_sz_kleiderschrank an");
fhem("set light_sz_musikregal an");
fhem("set light_sz_leselicht an");

# Dummy deaktivieen
fhem("set lichtabschaltung aus");
}


Der Dummy "lichtabschaltung" dient dabei um zusätzlich eine akustische Bestätigung auszugeben.

Nun mein Problem:
Die Lampen im Wohnzimmer funktionieren teilweise, die in der Küche werden gar nicht geschaltet. Die im Schlafzimmer funktionieren alle problemlos. Was mir auffällt ist die Tatsache, dass alle Lampen/LED-Stripes die nicht geschaltet sind offenbar keine originalen Hue-Elemente sind sondern Elemente von anderen Anbietern wie Müller oder Lidl. Sind aber alle über die Bridge ordnungsgemäß verbunden und lassen sich auch per Fhem-Befehl in der Commando-Zeile schalten. Nur im Script funktionieren sie nicht.

Hat irgendjemand eine Idee woran es liegen kann bzw. wie ich es beheben kann?

Ralli

Kann es sein, dass die Schaltbefehle zu schnell an die Bridge abgegeben werden?

Ich würde für solche Szenarien sowieso eher den Weg über eine Zone gehen, die in der Bridge definiert ist.
Gruß,
Ralli

Proxmox 8.1 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.6.20240316) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

Beta-User

Das größte "aua" verursacht sowas:
fhem("sleep 5");
Bitte dazu mal die Commandref befragen.

Ansonsten frag' ich mich, warum
- so viele "fhem" da stehen;
- keine LightScene, structure(s) oder HUE-Szenen verwendet werden;
- wieso da "an" als Setter verwendet sind.

die ersten 5 Stichworte bitte nachschlagen, zu "an" kannst du gerne dann fragen, wenn du das soweit durch hast.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Superposchi

@Ralli
Keine Ahnung wegen der Geschwindigkeit, kann ich mir aber nicht vorstellen, da im Schlafzimmer die Lampen direkt ohne Verzögerung geschaltet werden und diese ja eben funktionieren. Ich würde es wenn eher umgekehrt vermuten.
Das mit den Zonen/Gruppen ist ein guter Hinweis der auch schon umgesetzt ist. "light_ku_deckenlicht" ist eine solche, nur halt am Namen nicht mehr erkennbar. In den anderen Räumen machen Gruppen/Zonen keinen Sinn, da die Lampen bewust verzögert geschaltet werden sollen (siche unten) bzw. nicht alle Lampen geschaltet werden sollen und ich es vermeiden mögchte zu viele Gruppen/Zonen anzulegen.

@Beta-User
Also CommandRef gelesen aber verstehe nicht was du mit deinem Zitat genau sagen willst, was genau bereitet dir ein "Aua"?
Ich kann nur vermuten, dass du auf die interne Perl-Funktion mit der Schreibweise "sleep(5);" hinaus willst, weiß es aber nicht mit Sicherheit. Andernfalls ist die Schreibweise als Fhem-Befehl doch so korrekt.
Ok, über das Quiet kann man streiten, aber bei der Verwendung hat eine ID in meinen Augen keinen Nutzen, genau wie die Angabe eines Timespec oder Events. Ich will ja gerade erreichen, dass es wirkt als wenn jemand durch die Wohnung geht und nacheinander die Lampen einzeln ausschaltet. Also einfach den Off-Befehl unterschiedlich (nach entfernung der Lampe) verzögern.

Zu deinen Punkten eine kurze Erklärung:
Ich versuche mir anzugewöhnen alles in einzelnen Befehlen zu schreiben und damit eine gewisse Übersichtlichkeit zu schaffen, darum alles jeweils in einer einzelnen Zeile und als einzelner Befehl. Ist einfach eine persönliche Marotte und wiederspricht soweit ich es finden kann keiner Definition.
Struckture wäre in einzelnen Fällen machbar, wird aber z.B. in der Küche durch eine Hue-Gruppe (Deckenlicht) ersetzt. Mit Hue-Szenen kann man immer nur alle Lampen gleichzeitig beeinflussen was meinem Vorhaben (siehe oben) zu wiedersteht.
"LightScene" ist mir neu, nach dem einlesen erscheint es mir praktisch ähnlich wie die Hue-Gruppen/Zonen mit dem Unterschied, dass bei den Hue-Gruppen/Zonen neue Lampen einfacher in eine bestehende Gruppe aufgenommen werden können. Es muss nichts in Fhem geändert werden, sondern lediglich die neue Lampe in der Hue-App der Gruppe hinzugefügt werden.
Das "an" als Setter ist selbstverständlich ein Fehler - ist mir noch gar nicht aufgefallen bisher.

Beta-User

Am Ende des commandref-Abschnitts zu sleep findet sich:
ZitatBemerkung: falls sleep von keinem Befehl gefolgt wird, dann wird FHEM blockiert. Das ist unerwünscht, und im FHEM-Log wird eine Warnung protokolliert.
Ich sehe keinen Befehl, der dem sleep _in der fhem-Klammer_ nachfolgen würde. Also schau mal ins Log, ob sich was findet... (das dann ggf. auch die Erklärung dafür ist, dass sich die Bridge an manchen Ecken verschluckt?)

Das mit den einzelnen Zeilen mag ja übersichtlicher wirken, aber dir ist vermutlich nicht klar, dass das "speep-mäßig" dann nicht sequentiell abläuft, sondern alle (korrekt abgesetzten!) sleep mehr oder weniger zum gleichen Zeitpunkt _loslaufen_, und du so also nicht die "Kaskade" hinbekommst, die du erreichen willst...?

"structure" hat halt den Vorteil, dass man zeitlich und gruppenmäßig "staffeln" und verschachteln kann (und auch verschiedene "szenen" als Readings abspeichern, um sie später wiederherzustellen). Aber wie bei HUE-Szenen auch immer nur alles auf einmal. Die Hue-(Hardware-) Gruppen sind dafür funktechnisch sehr viel effizienter.
Lightscene kennt diese Einschränkung(en) nicht, aber ggf. musst du dann sleep-Kommandos einbauen (das geht, genauso wie einzelne Devices in einzelnen Szenen nicht zu schalten).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

MadMax-FHEM

#5
Schon mal ins Log geschaut?

Bei mir kommt bei "so einem Konstrukt" das hier:

Zitat
2021.09.11 18:29:02 1: WARNING: sleep without additional commands is deprecated and blocks FHEM

und fhem steht...

Warum also nicht (wie auch Beta-User geschrieben hat):


fhem("sleep 5; set switch_wz_deckenlicht off; set light_wz_fensterbanklicht off; sleep 5; set light_wz_wandlampe_rechts off; sleep 1; set light_wz_wandlampe_links off; sleep 5; set plug_wz_sideboard off")


EDIT: zu langsam aber ich lass das mal trotzdem... Und das wollte ich auch noch anfügen, dass sowas "parallel" losläuft:

fhem("sleep 5; set switch_wz_deckenlicht off; set light_wz_fensterbanklicht off; sleep 5; set light_wz_wandlampe_rechts off; sleep 1; set light_wz_wandlampe_links off; sleep 5; set plug_wz_sideboard off");
fhem("set irgendwas danach");

das "set irgendwas danach" wird quasi "gleichzeitig" mit dem ersten fhem("...") gestartet...
...also eben nix danach ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

TomLee

Zitat... gewisse Übersichtlichkeit zu schaffen, darum alles jeweils in einer einzelnen Zeile und als einzelner Befehl ...

Was noch keiner angesprochen hat, man kann mehrere Devices die den gleichen Befehl ausführen sollen auch kürzer schreiben, mAn. ist das dann richtig übersichtlich und vorallem einiges kürzer, die verschiedenen set-Anweisungen kann man ja weiterhin untereinander schreiben (zweites Beispiel).


fhem("set plug_ba_wandlicht off");
fhem("set light_ku_deckenlicht off");
fhem("set light_ku_schrankunterbaulicht off");


fhem('set plug_ba_wandlicht,light_ku_deckenlicht,light_ku_schrankunterbaulicht off');




fhem("set light_sz_computerlicht off");
fhem("set light_sz_buchregeallicht off");
fhem("set light_sz_deckenlicht_sportregal off");
fhem("set light_sz_kleiderschrank an");
fhem("set light_sz_musikregal an");
fhem("set light_sz_leselicht an");


fhem('set light_sz_computerlicht,light_sz_buchregeallicht,light_sz_deckenlicht_sportregal off;
set light_sz_kleiderschrank,light_sz_musikregal,light_sz_leselicht on');

Superposchi

ZitatIch sehe keinen Befehl, der dem sleep _in der fhem-Klammer_ nachfolgen würde. Also schau mal ins Log, ob sich was findet... (das dann ggf. auch die Erklärung dafür ist, dass sich die Bridge an manchen Ecken verschluckt?)
Das habe ich auf die gesamte Befehlsabfolge bezogen, nicht auf jeden Sleep-Befehl einzeln. Also lediglich auf ein Sleep am Ende des Scripts meine ich. Würde der Perl-Befehl Sleep Fhem auch blockieren? Hat das schon mal jemand probiert?

ZitatDas mit den einzelnen Zeilen mag ja übersichtlicher wirken, aber dir ist vermutlich nicht klar, dass das "speep-mäßig" dann nicht sequentiell abläuft, sondern alle (korrekt abgesetzten!) sleep mehr oder weniger zum gleichen Zeitpunkt _loslaufen_, und du so also nicht die "Kaskade" hinbekommst, die du erreichen willst...?
Das ist mir wirklich nicht bewusst und ergibt in meinen Augen auch wieder mal absolut keinen Sinn. Egal welche Programmiersprache, ich kenne es eigentlich immer nur so, dass die Befehle nacheinander und nicht zeitgleich ausgeführt werden. Ich muss mich in vielem umstellen bei Fhem. Würde das Perl-interne-Kommando Sleep auch gleichzeitig loslaufen?

Zitat"structure" hat halt den Vorteil, dass man zeitlich und gruppenmäßig "staffeln" und verschachteln kann (und auch verschiedene "szenen" als Readings abspeichern, um sie später wiederherzustellen). Aber wie bei HUE-Szenen auch immer nur alles auf einmal. Die Hue-(Hardware-) Gruppen sind dafür funktechnisch sehr viel effizienter.
Lightscene kennt diese Einschränkung(en) nicht, aber ggf. musst du dann sleep-Kommandos einbauen (das geht, genauso wie einzelne Devices in einzelnen Szenen nicht zu schalten).
Im Schlafzimmer und der Küche ginge das ja auch. Aber ich möchte eben im Wohnzimmer - was von Außen einsehbar ist - nicht alle Lampen gleichzeitig schalten. Wenn mal ein Einbrecher neugierig wird, würde ihm das sofort signalisieren, dass es eine Computerschaltung ist und kein Mensch der die Lampen ausmacht. Damit wäre der Schutz der Lampen bei Nichtanwesenheit dahin und ich kann sie auch gleich auslassen - ist aber nur meine Meinung.

Zitatfhem("sleep 5; set switch_wz_deckenlicht off; set light_wz_fensterbanklicht off; sleep 5; set light_wz_wandlampe_rechts off; sleep 1; set light_wz_wandlampe_links off; sleep 5; set plug_wz_sideboard off"); fhem("set irgendwas danach");
Zitatfhem('set light_sz_computerlicht,light_sz_buchregeallicht,light_sz_deckenlicht_sportregal off;
set  light_sz_kleiderschrank,light_sz_musikregal,light_sz_leselicht on');

Egal welche der beiden Schreibweisen, wenn ihr meint, dass das übersichtlicher ist kann ich das nicht nachvollziehen. Rein von der Schreibweise und Aufteilung ist da meiner Meinung nur Chaos. Da nachträglich was zu ergänzen oder schlimmer noch ein bestimmtes Device zu finden um es zu löschen oder zu ändern ist doch die pure Sucherei. Ist aber auch wieder einzig meine Meinung.
Da aber aktuell das ganze Script so nicht funktioniert wegen den gleichzeitigen Starts der einzelnen Befehle muss ich es jawohl doch irgendwie anders schreiben, aber Begeisterung darüber sieht anders aus.

Superposchi

Ich habe das Script jetzt erst mal wie folgt umgeschrieben:
sub Nachtschaltung
{
# Dummy aktivieen
fhem("set lichtabschaltung aktiv");

# Balkon und Küche
fhem("sleep 1; set plug_ba_wandlicht off");
fhem("sleep 3; set light_ku_deckenlicht off");
fhem("sleep 5; set light_ku_schrankunterbaulicht off");

# Wohnzimmerlichter
fhem("sleep 10; set switch_wz_deckenlicht off");
fhem("sleep 10; set light_wz_fensterbanklicht off");
fhem("sleep 15; set light_wz_wandlampe_rechts off");
fhem("sleep 15; set light_wz_wandlampe_links off");
fhem("sleep 20; set plug_wz_sideboard off");

# Schlafzimmerbeleuchtung
fhem("sleep 15; set light_sz_computerlicht off");
fhem("sleep 15; set light_sz_buchregeallicht off");
fhem("sleep 15; set light_sz_sportregal off");
fhem("sleep 15; set light_sz_kleiderschrank an");
fhem("sleep 15; set light_sz_musikregal an");
fhem("sleep 15; set light_sz_leselicht an");

# Dummy deaktivieen
fhem("sleep 25; set lichtabschaltung aus");
}

Ist ein Kompromiss zwischen der Funktionalität und der Übersichtlichkeit - Hoffe ich jedenfalls und werde es heute Abend checken ob alles korrekt funktioniert, sofern nicht jetzt schon jemand ein potenzielles Problem erkennt.

MadMax-FHEM

#9
Bei meinem Beispiel ging es ja nicht um Übersichtlichkeit sondern eben darum, dass die gesamte Kette 1x angestartet wird und die sleeps nicht blockieren und das dann auch so "abläuft" wie (so nehme ich an) von dir gedacht. Punkt.

Dein neues Script blockiert zumindest nicht...
...aber (again): jedes von den fhem(" ") läuft halt "quasi parallel" los.
EDIT: d.h. überall wo vorne derselbe sleep-Wert steht wird "quasi gleichzeitig" nach der sleep-Zeit gestartet...
Wenn das nicht stört, dann wird der Kompromiss wohl passen.

EDIT: und auch das hier
Zitat
      # Dummy deaktivieen
      fhem("sleep 25; set lichtabschaltung aus");
ist nur so, wenn 25s reicht damit alles abgearbeitet ist. D.h. wenn du mal irgendwo vorne eine höhere sleep-Zeit hast, dann stimmt das so nicht mehr. Wenn du es in "EINE Kette" packst, dann schon und du brauchst nicht extra verzögern ;)
Jaja, natürlich nicht so übersichtlich 8)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Superposchi

Ich sagte ja es ist ein Kompromiss.
Ich tue mich damit einfach unheimlich schwer alles in so monsterlane ketten zu packen. Besonders wenn die Syntex dann auch noch immer wieder vo einander abweichen ist. Ich meine Mal mit , dann mit ; und mnchal sogar mit ;; geschrieben, je nach dem wo es gerade eingegeben wird. Das merkt man sich vielleicht nach Jahren, aber nicht als Anfänger.

Zitatfhem("sleep 25; set lichtabschaltung aus");
Der Zeitpunkt spielt keine Rolle. Es dient einzig dem Zweck, dass die Routine für die Akustische Ansage wieder "geschlossen" wird und beim nächsten Mal neu ausgelöst werden kann. Theoretisch könnte das direkt nach dem ersten Kommando zur Aktiv-Schaltung schon passieren. Es ist nur Optik das ich es an den Schluss gesetzt hatte.

justme1968

jede hue bridge hat eine 'virtuelle' gruppe 0 die alle lampen umfasst. über diese solltest du alles ausschalten.

also wenn du alles ausschalten willst: set <bridge> <name von gruppe 0> off und gut ist.

die übrigen anmerkungen von oben stimmen alle ebenfalls:
- so viele hue lampen nicht einzeln schalten sondern in gruppen. sonst gibt es probleme mit der funklast.
- abgesehen davon wäre ein set TYPE=HUEDevice off einfacher als die ganze aufzählerei. siehe devspec
   in der commandref.
- mit einem FILTER kann man das auch noch auf lampen einschränken die tatsächlich an sind.
- niemals sleep ohne etwas dahinter.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Superposchi

Du hast schon die Begründungen gelesen die ich geschrieben habe, oder?

Der Hinweis mit der Gruppe 0 ist ja gut, aber bringt genauso wenig in der Situation.
Ich will eben die Lampen aus besagten Gründen einzeln schalten.

Beta-User

@justme1968:
Es ist zwecklos, mit dem TE diskutieren zu wollen...

Ich hätte diesen Thread auch direkt auf die "ignoriere ich"-Liste genommen, wenn nicht so prototypisch "hübsch" alles auf einmal falsch gemacht worden wäre :P .

@Superposchi:
Bzgl. des "hübsch untereinander: Man kann das fhem("..."); _einmal_ "aufklappen" und dann alle Anweisungen hübsch untereinander schreiben - die Formatierung ist in myUtils nämlich weitestgehend egal, (was dir hier aber auch schon (von anderen) versucht wurde mitzuteilen)...

Ich bin dann mal wieder raus aus diesem Thread hier, es ist alles gesagt, was der TE zur Lösungsfindung braucht.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

justme1968

ich habe schalter an der wand die schalten auch mehrere lampen oder ganze zimmer auf einmal. feste reihenfolgen und zeiten sind auch nicht besonders natürlich.

auch wenn es sinnlos ist noch drei letzte tipps:

eine automatik mit sleep zu bauen ist selbst wenn man es richtig macht eine krücke. fehler bei erweiterungen oder änderungen am system sind vorprogrammiert.

fhem ist event basiert. das sollte man nutzen wenn man schon die in der hardware dafür vorgesehenen dinge wie gruppen nicht nutzen will. man kann mit sleep auch auf ein event warten. d.h. eine sache passiert wenn das even für den abschluss der sache davor kommt. egal wie lange es dauert. damit kann man sich code bauen der z.b. zufällige rampen in die schaltvorgänge baut und erst weiter machen wenn eine lampe wirklich aus ist. ohne das zeiten hard codiert sind.

structure und LightScene kann dinge automatisch nacheinander schalten.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968