setstate FHEMWEB und Refresh oder Longpoll?

Begonnen von chrissi323, 20 Januar 2014, 21:41:00

Vorheriges Thema - Nächstes Thema

chrissi323

Hallo Zusammen,

erster Post und gleich eine Frage...

Ich setze mit FHEM gerade die Steuerung meiner MAX! Komponenten um, nach drei Abenden und etwas Anschub per PM von einem netten Mitglied bin ich fast da. Alles in allem ging das einfacher als gedacht  :), an einer Sache scheitere ich aber im Moment.

Ich habe ein Dummy der wie folgt definiert ist:


define Automatikmodus_Schlafzimmer dummy
attr Automatikmodus_Schlafzimmer group Heizung Schlafzimmer
attr Automatikmodus_Schlafzimmer room Heizung
attr Automatikmodus_Schlafzimmer setList Programm:Arbeitswoche,Urlaub,unbenutzt,manuell
attr Automatikmodus_Schlafzimmer webCmd Programm


Danach kommen kommen noch zwei Notifies die hier aber nicht relevant sind denke ich. Da man bei den MAX! Komponenten ja auch am Thermostat von Auto auf Manuell und zurück schalten kann, merke ich mir das zuletzt eingestellte Programm (z.B. Programm Arbeitswoche) in einem weiterem Dummy. Wenn man dann am Thermostat wieder auf Auto stellt lese ich den Dummy mit Value() aus und schreibe mit setstate den State zurück in Automatikmodus_Schlafzimmer. Das Notify was das macht sieht so aus:


define Schlafzimmer.manueller.Eingriff.Thermostat notify MAX_057d67.*mode.* {\
my $UpdateDummy = "Automatikmodus_Schlafzimmer";;\
my $tempdevice = "Status_Automatikmodus_Schlafzimmer";;\
my $mode=$EVENT;;\
$mode =~ s/mode: //;;\
if ($mode eq "manual") {\
  fhem("setstate $UpdateDummy Programm manuell");;\
}\
elsif ($mode eq "auto") {\
  fhem("setstate $UpdateDummy ".Value($tempdevice));;\
}\
}


Das funktioniert auch, aber FHEMWEB aktualisiert das Dummy Device Automatikmodus_Schlafzimmer nicht. Erst nach einem Reload im Browser steht (wenn man von manuell wieder auf Auto zurückschaltet und das vorher geladene Programm Arbeitswoche war) das Reading auf "Programm Arbeitswoche" und die Klappliste auf "Arbeitswoche". An dem Notify kann es nicht hängen, ich habe das gleiche Verhalten, wenn ich über telnet ein setstate manuell absetze.

Ein

setreading Automatikmodus_Schlafzimmer state Programm Arbeitswoche


auf der Telnetkonsole führt übrigens dazu, dass das Reading sofort aktualisiert wird, die Klappliste aber auch erst nach einem Reload.

Als Browser verwende ich Chrome, in Firefox hat es aber auch nicht geklappt.

Verstehe ich das was grundfalsch oder sollte ich nicht eigentlich auf diese Weise ein Dummydevice den gewünschten State geben können?

Ansonsten bin ich total begeistert von FHEM, ich muss mich gerade arg zügeln um nicht alle mögliche Hardware zu kaufen und damit Dinge anzustellen "nur weil ich es kann" die ich eigentlich nicht benötige :-)

Gruß

Christian

crc

Hallo Christian,

ich stehe leider vor dem gleichen Problem. Ich mache ein

define KU_Licht_Notify notify KU_Licht1:on setstate KU_Licht on


Der Status von KU_Licht wird "im Hintergrund" richtig gesetzt, aber ich muss erst die Browser-Seite neu laden, damit die Glühbirne im FHEM web auch "leuchtet".

Hast Du mittlerweile ein Lösung für Dein Problem gefunden?

Viele Grüße,
CRC



Benni

Ich weiß nicht, wieso immer alle auf setstate kommen.  ::)

Siehe Commandref zu setstate:

Zitat
Der Befehl setzt den STATE Eintrag des Gerätes direkt, ohne Ereignisse zu generieren oder ein Signal an das Gerät zu senden.

Kein Ereignis -> Keine Aktualisierung!

Für was war gleich noch der set-Befehl da?    ;)

crc

Danke für die Antwort, aber hier geht es nicht um Schalten sondern NUR um Setzen des Status, also ist "setstate" richtig gewählt.

Und kurz wiederholt, es wird alles richtig umgesetzt, nur muss der Browser die aktuelle Seite neu laden, damit die "gelbe Glühbirne" auch erscheint.
Gewünscht ist, dass die "gelbe Glühbirne" direkt erscheint.


Benni

Zitat von: crc am 24 März 2017, 21:48:18
Danke für die Antwort, aber hier geht es nicht um Schalten sondern NUR um Setzen des Status, also ist "setstate" richtig gewählt.

Und kurz wiederholt, es wird alles richtig umgesetzt, nur muss der Browser die aktuelle Seite neu laden, damit die "gelbe Glühbirne" auch erscheint.
Gewünscht ist, dass die "gelbe Glühbirne" direkt erscheint.

Wie ich schon sagte: Kein Event -> keine Aktualisierung!

crc

Das ist vielleicht eine Erklärung, aber helfen tut es mir nicht weiter.

Benni

Ok, schubsen reicht wohl nicht  ;) 

Du musst eben dafür sorgen, dass ein Event erzeugt wird.

Du kannst bspw. statt mit setstate direkt den STATE des device zu anzupassen, in deinem notify auch einfach ein eigenes Reading mit dem gewünschten Wert setzen:


setreading KU_Licht eventState on


Wenn du dann stateFormat auf dieses Reading setzt


attr KU_Licht stateFormat eventState


ggf. ist noch eine Anpassung von event-on-change-reading erforderlich. Bspw.:


attr KU_Licht event-on-change-reading .*


Dann sollte das eigentlich so funktionieren.

Wofür benötigt man denn ein Schalten ohne zu schalten?


crc

Vielen Dank, Benni!

Schubser reichen manchmal nicht, manchmal muss man richtig schieben ;-)

Ich wusste gar nicht, dass es "niemand" braucht, daher kurz warum ich.

Ich habe (vor FHEM) bereits ein installiertes FS20 System zum Schalten mehrerer Leuchten pro Raum. Das FS20 bietet aber auch "Funktionsgruppen" an, damit man, wie in meinem Fall, mehrere Lampen zusammen fassen kann, im Prinzip, das was in FHEM "Strukturen" sind. So kann man einzeln schalten, aber auch ganzen "Funktionsgruppen" auf einmal.

Die FS20 Funktionalität von "Funktionsgruppen" hat den Vorteil, dass

  • nur ein Befehl gesendet wird, statt wie bei der "Struktur" mehrere (1% Regel)
  • dadurch alle Lampen gleichzeitig schalten nicht zeitlich hintereinander
  • beim Ausfallen des FHEM-Systems noch seine Funktionalität diesbezüglich gewährt bleibt

Und jetzt kommt der Punkt: Ich möchte gerne im FHEMweb sehen wie der Zustand der Lichter zB. in der Küche (KU_Licht) ist, dazu benutze ich setstate. Sind alle KU-Lichter (KU_Licht1,2...) an, dann soll KU_LICHT auch "on" sein, umgekehrt alle aus, dann KU_Licht "off", sonst "undefined".

So ergibt sich der Bedarf ... aber wahrscheinlich sagst Du mir jetzt: "Auch sooo, ja das hättest Du aber auch einfacher haben können, nämlich ..." ;-)

Schönen Sonntag,
Franz

Benni

Wenn es dir nur um die Visualisierung des Gesamt-Status geht, wäre tatsächlich auch dafür eine Structure geeignet. Man muss die ja nicht zwingend auch zum Schalten benutzen. ;)

Was für ein Device-TYPE ist den KU_Licht ?

crc

#9
Habe es ja auch so versucht:


define KU_Licht FS20 12441123 4412 gm 4444
...

define KU_Licht1 FS20 12441123 1211 fg 4412 gm 4444
attr KU_Licht1 userattr roomlight roomlight_map structexclude
...

define KU_Licht2 FS20 12441123 1212 fg 4412 gm 4444
attr KU_Licht2 userattr roomlight roomlight_map structexclude
...

define KU_Licht_Struktur structure roomlight KU_Licht1 KU_Licht2
attr KU_Licht_Struktur userattr roomlight roomlight_map structexclude

define KU_Licht_StatusNotify notify KU_Licht_Struktur setstate KU_Licht $EVENT


aber leider hat es auch geschaltet, zuerst hatte ich es nicht bemerkt, aber im "Event Monitor" gesehen, dass er jede Lampe nochmal einzeln schaltet, obwohl ich "setstate" benutzt habe.

"KU_Licht" ist eine FS20-Funktionsgruppe, dh. ein "Kanal" auf dem mehrere Lampen reagieren, also kein "dummy".

andies

Ich hänge an einer ähnlichen Stelle und komme nicht weiter. Ich habe verstanden, dass ein setstate den STATE eines Gerätes ändert und kein Event erzeugt. Ich entnehme dem Beitrag und der Commanref (mehr oder weniger), dass ein
set <device> <irgendwas>
den STATE des devices nun auf <irgendwas> setzt und ein event erzeugt wird.  Erste Frage: Ist das richtig?

Dazu nun die zweite Frage. Ich habe ein dummy, der ein Gartentor schaltet. Da es dort kein Zu/Auf, sondern nur einen einzigen Knopf gibt, habe ich den "ZuAuf" genannt. Nun hätte ich gern einen STATE der anzeigt, dass man die Taste gedrückt hat (auf dem Handy sieht meine Frau sonst nicht, dass sie gedrückt hat und drückt im Zweifel mehrfach mit nicht planbaren Folgen). Dazu habe ich mir zuerst folgenden dummy definiert
defmod Gartentor_Auto dummy
attr Gartentor_Auto setList state:XXXX,------
attr Gartentor_Auto webCmd ZuAuf

und dann ein notify, das die eigentliche Schaltung erledigt
defmod Gartentor_Auto_bewegen notify Gartentor_Auto:ZuAuf {fhem("set sduino raw <hier uninteressant>");;
if (fhem("getstate Gartentor_Auto") eq "------"){fhem("set Gartentor_Auto XXXX")}
else {fhem("set Gartentor_Auto ------")}}

Abgesehen davon, dass der Code entsetzlich umständlich ist (da hätte ich gern einen Tipp, wie das besser geht), funktioniert es aber nicht. Ich muss nach jeder Schaltung ein refresh machen, damit man im FHEMWEB den neuen STATE sieht. Ist das ok? Wenn ich dagegen "set Gartentor_Auto XXXX" direkt eingebe, wird das sofort und ohne refresh angezeigt?!
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann