Tote Schleife

Begonnen von eddie1104, 04 Dezember 2015, 10:51:52

Vorheriges Thema - Nächstes Thema

eddie1104

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 ?

frank

was hast du denn genau vor? die funktion scheint auch nicht vollständig zu sein.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

eddie1104

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.

Ellert

define n_Licht_Etage_Treppe_on notify Licht_Etage_Treppe:on set Hauptschalter_Licht statusRequest hat m.E die gleiche Wirkung ohne Schleife.

viegener

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)...

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

eddie1104

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.

Bennemannc

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
Cubietruck, Fhem 5.8
CC-RT-DN|LC-SW2-FM|RC-12|RC-19|LC-SW4-BA-PCB|LCp-SW1-BA-PCB|ES-PMSw1-Pl|LC-Bl1PBU-FM|PBI-4-FM|CC-VD|CC-TC|SEC-SC(2)|RC-KEY3-B|LC-Sw1PBU-FM|PB-2-FM|WDS100-C6-O|WDC7000|LC-Bl1-FM
Module: Dewpoint,FB_Callmonitor,HCS,Panstamp,at,notify,THRESHOLD,average,DOIF

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eddie1104

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.


viegener

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?
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

eddie1104

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.

Ellert

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

viegener

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 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

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

eddie1104

@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.