Ich habe eine Funktion mit der ich eine einzelnes Lichtquelle ein- bzw. ausschalten kann. Gleichzeitig möchte ich den Status des Hauptschalters aktualisieren.
fhem ("set $switch $new_state");
my $state = "statusRequest";
fhem ("set Hauptschalter_Licht $state");
Im fhem.cfg rufe ich die Funktion auf mit :
define n_Licht_Etage_Treppe_on notify Licht_Etage_Treppe:on {switch_licht("Licht_Etage_Treppe", "on")}
define n_Licht_Etage_Treppe_off notify Licht_Etage_Treppe:off {switch_licht("Licht_Etage_Treppe", "off")}
Das führt zu einer toten Schleife, habe ich mir vorher nicht richtig überlegt. Nun stellt sich für mich die Frage, wie ich das Problem sonst lösen soll. Ich habe jetzt temporär einen Zeitauftrag in fhem.cfg eingebaut mit dem ich alle 5 Sekunden "set Hauptschalter_Licht statusRequest" aufrufe. Das möchte ich aber aus Performancegründen nicht.
Hat irgendjemand eine gute Idee ?
was hast du denn genau vor? die funktion scheint auch nicht vollständig zu sein.
Ich habe die Funktion um den Ein, bzw. Ausgang gekürzt. Im wesentlichen besteht die Funktion aus diesen 3 Zeilen. Ich möchte in der Funktion den Status für den Hauptschalter updaten. Hier aber nochmal die ganze Funktion
sub switch_licht
{
my($switch, $new_state)=@_;
my $ret = "Funktionsaufruf : switch_licht($switch, $new_state)";
fhem ("set $switch $new_state");
my $state = "statusRequest";
fhem ("set Hauptschalter_Licht $state");
return $ret;
}
In der Funktion für den Hauptschalter ermittele ich, welche Lampen an sind und welche nicht und gebe dann eine qualifizierte Meldung für deen Hauptschalter aus. Diese Funktion geht einwandfrei. Hierin realisiere ich auch die Toggle-Funktion und den Nachtschalter.
Wenn ich jetzt irgend eine Lampe einschalte dann soll immer automatisch der Status für den Hauptschalter aktualisiert werden. Meine Idee war es, eine Funktion zu schreiben, die die gewünschte Lampe ein- oder ausschaltet, anstatt die eingebaute Funktionalität zu nutzen. Nur da ich ja in dieser Funktion mit
fhem ("set $switch $new_state");
den Status nochmal setze komme ich über die Definition in der fhem.cfg
define n_Licht_Etage_Treppe_on notify Licht_Etage_Treppe:on {switch_licht("Licht_Etage_Treppe", "on")}
define n_Licht_Etage_Treppe_off notify Licht_Etage_Treppe:off {switch_licht("Licht_Etage_Treppe", "off")}
in die tote Schleife.
Wie kann ich also den Status des Hauptschalters immer mit aktualisieren, wenn ich eine beliebige Lampe schalte.
define n_Licht_Etage_Treppe_on notify Licht_Etage_Treppe:on set Hauptschalter_Licht statusRequest
hat m.E die gleiche Wirkung ohne Schleife.
Der Hintergrund ist, Du reagierst auf das Einschalten des Lichtes mit einem weiteren Einschalten des Lichtes. Dabei willst Du doch nur den Hautpschalter aktualisieren (das Licht ist ja schon an)...
Ich habe den Code
define n_Licht_Etage_Treppe_on notify Licht_Etage_Treppe:on set Hauptschalter_Licht statusRequest
ausprobiert. Leider führt auch das zu Blockaden weil in der entsprechenden Funktion auch wieder Set-Befehle auf den Hauptschalter ausgeführt werden. Wenn es möglich wäre, wenn ich in einem Dummy-Device (Mein Hauptschalter ist ein solches) nur den Status ändern kann, ohne wieder neu zu schalten, dann wäre das die Sau in Tüten. Bisher bin ich lediglich in der Lage, den Status neu zu setzen, indem ich den entsprechenden Schaltvorgang auslöse.
Hallo,
ich habe auch eine Überwachung - allerdings aktualisiere ich keinen Hauptschalter - ich arbeite mit Structure. Alle Lampe sind in der Struktur und wenn eien an geht, ändert sich der Status der Struktur.
Vielleicht wäre das ein anderer Lösungsansatz.
Gruß Christoph
Alternativvorschlag:
define di_n_Licht_Etage_Treppe DOIF ([Licht_Etage_Treppe:?on])
({switch_licht("Licht_Etage_Treppe", "on")})
DOELSEIF ([Licht_Etage_Treppe:?off])
({switch_licht("Licht_Etage_Treppe", "off")})
DOIF unterbindet automatisch "tote Schleifen".
Gruß
Damian
Ich habe jetzt glaube ich eine Lösung die geht. In der fhem.cfg habe ich für alle Lampen 2 Einträge wie von Ellert vorgeschlagen
define n_Licht_Etage_Treppe_on notify Licht_Etage_Treppe:on set Hauptschalter_Licht statusRequest
define n_Licht_Etage_Treppe_off notify Licht_Etage_Treppe:off set Hauptschalter_Licht statusRequest
und in der Funktion switch_hauptschalter_licht habe ich das Schalten unterbunden und setze nur noch den Status, also anstatt
set Hauptschalter_Licht Nacht
verwende ich jetzt
setstate Hauptschalter_Licht Nacht
Das funktioniert bisher ohne Klagen. Ich bedanke mich hier bei allen, die mir Anfänger ein bisschen die Hand gehalten haben.
Ich verstehe glaube ich immer noch nicht, was Du erreichen will und warum dazu Extrafunktionen nötig sind.
Ausserdem ist mir unklar, was der statusRequest bei Hauptschalter_Licht erreichen soll, wenn es sicht wirklich um einen dummy device handelt?
Also: Welche Funktionen sind denn vorhanden und was soll damit erreicht werden?
Die gesamte Lösung ist bis auf wenigen Ausnahmen mit Homematic Komponenten (Licht: Unterputz einfach und zweifach Schalter) realisiert. Aber der Hauptschalter Licht ist ein reiner Software-Schalter, mit dem ich über die Weboberfläche folgende Funktionen habe:
- alles aus
- alles an
- Toggle
- Nachtschaltung nur 2 Lampen an, die restlichen aus
- Wohnbereich abends, in dem nur der Wohnbereich beleuchtet und alles andere ausgeschaltet wird
Das Gros dieser Funktionalität kann ich ohne Probleme mit normalen Notifys regeln. Aber schon das Toggle (zugegebenermaßen macht es nicht viel Sinn) ist mit einer Funktion ein Kinderspiel. Ich teste einfach den aktuellen Status jeder Lichtquelle und setze dann bei aus neu an und bei an neu aus. Aber mein größtes Problem war, dass ich ja die Lampen auch alle einzeln per Weboberfläche oder mit Hardwaretastern schalten kann, und dann wird der Status des Hauptschalters nicht aktualisiert. Ich möchte aber da stehen haben An, Aus, Nacht, Wohnen, bzw. das entsprechende Symbol oder, wenn kein festes Szenarium vorliegt, dann "x an, y aus".
Ich habe am Anfang versucht das ganze mit einer Struktur zu machen aber nachdem ich festgestellt habe, dass dann FHEM neue Attribute zu den tatsächlichen Devices ganz eigenständig hinzufügt und das dann leider Gottes bei einem Umbenennen nicht gerade rückt, da war mir das zu verwirrend. Ich habe dann nach einer einfacheren und für mich überschaubareren Lösung gesucht und mit dem Dummy auch gefunden. Nur das Aktualisieren des Status hat nicht funktioniert.
Zitat von: eddie1104 am 06 Dezember 2015, 20:18:58
Ich habe den Code
define n_Licht_Etage_Treppe_on notify Licht_Etage_Treppe:on set Hauptschalter_Licht statusRequest
ausprobiert. Leider führt auch das zu Blockaden weil in der entsprechenden Funktion auch wieder Set-Befehle auf den Hauptschalter ausgeführt werden. Wenn es möglich wäre, wenn ich in einem Dummy-Device (Mein Hauptschalter ist ein solches) nur den Status ändern kann, ohne wieder neu zu schalten, dann wäre das die Sau in Tüten. Bisher bin ich lediglich in der Lage, den Status neu zu setzen, indem ich den entsprechenden Schaltvorgang auslöse.
Status setzen ohne Trigger: setstate Hauptschalter_Licht statusRequest
siehe http://fhem.de/commandref_DE.html#setstate (http://fhem.de/commandref_DE.html#setstate)
Zitat von: eddie1104 am 07 Dezember 2015, 06:39:19
Die gesamte Lösung ist bis auf wenigen Ausnahmen mit Homematic Komponenten (Licht: Unterputz einfach und zweifach Schalter) realisiert. Aber der Hauptschalter Licht ist ein reiner Software-Schalter, mit dem ich über die Weboberfläche folgende Funktionen habe:
- alles aus
- alles an
- Toggle
- Nachtschaltung nur 2 Lampen an, die restlichen aus
- Wohnbereich abends, in dem nur der Wohnbereich beleuchtet und alles andere ausgeschaltet wird
Das Gros dieser Funktionalität kann ich ohne Probleme mit normalen Notifys regeln. Aber schon das Toggle (zugegebenermaßen macht es nicht viel Sinn) ist mit einer Funktion ein Kinderspiel. Ich teste einfach den aktuellen Status jeder Lichtquelle und setze dann bei aus neu an und bei an neu aus. Aber mein größtes Problem war, dass ich ja die Lampen auch alle einzeln per Weboberfläche oder mit Hardwaretastern schalten kann, und dann wird der Status des Hauptschalters nicht aktualisiert. Ich möchte aber da stehen haben An, Aus, Nacht, Wohnen, bzw. das entsprechende Symbol oder, wenn kein festes Szenarium vorliegt, dann "x an, y aus".
Ich habe am Anfang versucht das ganze mit einer Struktur zu machen aber nachdem ich festgestellt habe, dass dann FHEM neue Attribute zu den tatsächlichen Devices ganz eigenständig hinzufügt und das dann leider Gottes bei einem Umbenennen nicht gerade rückt, da war mir das zu verwirrend. Ich habe dann nach einer einfacheren und für mich überschaubareren Lösung gesucht und mit dem Dummy auch gefunden. Nur das Aktualisieren des Status hat nicht funktioniert.
Danke, das ergibt ein Bild was Du erreichen willst.
Wenn ich es richtig verstehe, sollte das Modul Lightscene http://fhem.de/commandref.html#LightScene (http://fhem.de/commandref.html#LightScene) den grössten Teil Deiner Anforderungen umsetzen. Bei 2 Teilen bin ich mir nicht sicher:
- Toggle - passt vermutlich nicht wirklich auf Lightscene, denn hier sollen ja alle Lamepn umgeschaltet werden (Wofür soll das gut sein?)
- Ob Lightscene die aktuelle Szene auch anzeigt, wenn sie manuell erreicht wurde ist mir nicht klar
@Ellert :
Ich habe das exakt mit diesem Befehl zum Laufen bekommen. Ich hatte zunächst noch
setreading Hauptschalter_Licht state Nacht
ausprobiert aber das ging auch nicht.
@viegener
Das mit dem Modul Lightscene werde ich noch mal ausprobieren.