[Hinweis] Anzeige in FHEM - Web soll sich erst ändern wenn Rückmeldung kommt

Begonnen von ZeitlerW, 02 Januar 2016, 13:09:37

Vorheriges Thema - Nächstes Thema

ZeitlerW

Hallo zusammen,

hier ein kurzer Hinweis wie Rückmeldeobjekte behandelt werden können.

Aufbau:

  • Licht wird durch EIB 0/0/1 geschaltet.
  • Aktor meldet an EIB 0/0/2 den Status zurück

Gewünschtes Verhalten:
Anzeige des Devices in FHEM - Web soll sich in FHEM erst ändern, wenn das Rückmeldeobjekt sich ändert.

Lösung:
Nutzung von EIBreadingX und event-on-update-reading:


define Licht EIB 0/0/1 0/0/2
attr Licht EIBreadingX 1
attr Licht event-on-update-reading getG2


Vielleicht hat ja jemand Verwendung dafür bzw. kopiert es ins WIKI.

lG
Wolfgang

Michael Schmidt

Perfekt vielen Dank danach suche ich schon eine Weile :)

Habe allerdings noch ein weiteres Problem.

Ich Habe eine Sollwertvorgabe im FHEM realisiert.
Der Sollwert (genauer die Verschiebung) wird per FHEM Dummy und notify versendet.

wenn ich nun aber am Regler im Raum (in diesem Fall Büro) die Solltemperatur verändere,
möchte ich das auch in FHEM die neue Temperatur im Dummy geupdated wird.

hast du (oder jemand anderes :) )eine Idee wie das zu realisieren ist


Hier mal der code für die Sollwertverschiebung des Dummy
define noti_buero_temperaturauswahl notify dum_buero_temperaturauswahl {\
if ("$EVENT" eq "16") { fhem "set com_buero_sollwertverschiebung value -8" }\
elsif ("$EVENT" eq "17") { fhem "set com_buero_sollwertverschiebung value -6" }\
elsif ("$EVENT" eq "18") { fhem "set com_buero_sollwertverschiebung value -4" }\
elsif ("$EVENT" eq "19") { fhem "set com_buero_sollwertverschiebung value -2" }\
elsif ("$EVENT" eq "20") { fhem "set com_buero_sollwertverschiebung value 0" }\
elsif ("$EVENT" eq "21") { fhem "set com_buero_sollwertverschiebung value 2" }\
elsif ("$EVENT" eq "22") { fhem "set com_buero_sollwertverschiebung value 4" }\
elsif ("$EVENT" eq "23") { fhem "set com_buero_sollwertverschiebung value 6" }\
elsif ("$EVENT" eq "24") { fhem "set com_buero_sollwertverschiebung value 8" }\
        elsif ("$EVENT" eq "26") { fhem "set com_buero_sollwertverschiebung value 12" }\
}
attr noti_buero_temperaturauswahl alias Temperaturauswahl Büro
attr noti_buero_temperaturauswahl group Logiken
attr noti_buero_temperaturauswahl room Logiken

define dum_buero_temperaturauswahl dummy
attr dum_buero_temperaturauswahl alias Solltemperatur
attr dum_buero_temperaturauswahl group Heizung
attr dum_buero_temperaturauswahl room 5 Büro
attr dum_buero_temperaturauswahl setList state:16,17,18,19,20,21,22,23,24,26
attr dum_buero_temperaturauswahl webCmd state

define com_buero_sollwertverschiebung EIB 3/4/4
attr com_buero_sollwertverschiebung IODev KNX
attr com_buero_sollwertverschiebung group Heizung
attr com_buero_sollwertverschiebung model dpt6.010
attr com_buero_sollwertverschiebung room hidden


Gruß

ZeitlerW

Hallo Jensmaier2,

ich würde da was mit DOIF machen z.b.

define doif_buero_temperaturauswahl DOIF ([dum_buero_temperaturauswahl])(set com_buero_sollwertverschiebung value {([dum_buero_temperaturauswahl])*2-20})
attr doif_buero_temperaturauswahl do always


Dann würde ich EIBreadingSender setzen, damit die die Physikalische Adresse des RTR auswerten kannst und es zu keinem Kreisläufer kommt. Außerdem ist es hilfreich wenn du den Wert der Temperaturverschiebung als userReading hast:
z.B. wenn die PA 6.6.6 ist:

attr com_buero_sollwertverschiebung userReadings wert {ReadingsNum("com_buero_sollwertverschiebung","state",0)}
attr com_buero_sollwertverschiebung EIBreadingSender 1
define doif_buero_rtr_update DOIF ([com_buero_sollwertverschiebung:sender] eq "6/6/6") (set dum_buero_temperaturauswahl  {([com_buero_sollwertverschiebung:wert])/2+20})
attr doif_buero_rtr_update do always
attr dum_buero_temperaturauswahl event-on-change-reading state

.. ungetestet  :)

... Achtung ich habe am 07.01. 19:00 Änderungen gemacht

lG
Wolfgang

Michael Schmidt

Hallo Wolfgang

Vielen vielen DANK für die Hilfestellung

Hinter den doif Syntax bin ich nun gestiegen und
define doif_buero_temperaturauswahl DOIF ([dum_buero_temperaturauswahl])(set com_buero_sollwertverschiebung value {([dum_buero_temperaturauswahl])*2-20})
attr doif_buero_temperaturauswahl do always

hat meine fhem.cfg direkt 100 Zeilen verkleinert.
Manchmal fehlt einfach nur der richtige Denkanstoß :)

jedoch kommt bei einer Sollwertänderung am RTR nicht die sollwertverschiebung zurück sondern es wird auf Gruppenadresse 3/3/4
die Solltemperatur (vollständig 2byte) gesendet.

wäre dann folgendes richtig?
define doif_buero_rtr_update DOIF ([com_buero_sollwert:sender] eq "3/3/4") (set dum_buero_temperaturauswahl  {([com_buero_sollwert:wert])})


Ich versuche vergeblich etwas über EIBreading Sender rauszufinden.
Alles was ich finden kann ist dass das Attribut sehr neu ist (08/2015).

hast du eine Dokumentation oder syntax und Optionen für das command?

Der FHEM scheint ja leider allgemein nicht sehr knx lastig zu sein :(



Gruß
Michael


ZeitlerW

Hallo Michael,

wenn die Solltemperatur zurück kommt würde ich es wie folgt machen

define com_buero_sollwert EIB 3/3/4
attr com_buero_sollwert model tempsensor
attr userReadings wert {ReadingsNum("com_buero_sollwert","state",0)}

define doif_buero_rtr_update DOIF ([com_buero_sollwert])(set dum_buero_temperaturauswahl [com_buero_sollwert:wert])
attr doif_buero_rtr_update do always

attr dum_buero_temperaturauswahl event-on-change-reading state



Beschreibung:

Device anlegen für den Sollwert der Raumtemperatur
Modell tempsensor
Da die immer mit °C kommt UserReading wert anlegen

DOIF anlegen damit das Dummy dum_buero_temperaturauswahl den richtigen Wert bekommt

Dem Dummy noch das Attribut  event-on-change-reading state verpassen, damit bei der Bedienung und der späteren Rückmeldung keine Kreisläufer entstehen.


... zum Thema EIBreading.

Hier kannst du in einem Reading die Physikalische Adresse des EIB - Devices anzeigen lassen. Leider ist die Syntax etwas veschoben, so daß die Adresse in der Gruppenadress - Notation angezeigt wird (x/x/x) anstatt (x.x.x).
Die Idee war, die Physikalische Adresse des RTR auszuwerten um diese von der Physikalischen Adresse des FHEM (0/0/0) zu unterscheiden. Ist aber eigentlich nicht notwendig.

p.s.

Das Konstrukt {([])} im DOIF ist nur notwendig wenn du rechnen willst.


ZitatDer FHEM scheint ja leider allgemein nicht sehr knx lastig zu sein :(

Dank Andi hat sich da sehr viel verbessert.
Außerdem, je mehr mitmachen desto KNX - lastiger wird es :)

lG
Wolfgang


Andi291

Hallo Wolfgang,

danke für die Blumen :-)

Zum Eingangsposting - so ganz stimmts ja leider nicht. State ändert sich ebenso, wenn getG1 kommt, nicht nur wenn getG2 kommt. So werden zum Beispiel Icons über beide GA umgeschalten.
Aktuell zeige ich bei Aktionen immer erst ein Warte-Icon. Erst über die Rückmeldeadresse wird der Zustand zugesteuert. Das haut so leider nicht hin...

Aber ein Interessanter Ansatz, den Du hier beschreibst...

Was wäre, wenn das Reading state bei der Angabe von mehreren GA nicht auf die erste hört? Aber auf welche dann? Nur auf die zweite? Auf alle ab der Zweiten?
Fragen über Fragen - muss ich mal in Ruhe drüber nachdenken...

Meinungen?

Grüße, Andi

Groej

Moin,

cool Danke wollte gerade ein Thema wegen Status am KNX aufmachen und da seh ich doch beim suchen diesen Eintrag.

Ich habe das Problem das ich auf den KNX Bus eine Timerfunktion habe die alle Lampen in der Garage für 10 Minuten einschaltet wenn das Garagentor geöffnet wird über den Funksender. Problem ist nun das die Timerfunktion eine eigene Gruppennummer hat und wenn diese geschaltet wird der Status der Lampen im FHEM nicht geändert wird halt weil die Rückgabe-/Statusgruppe für das Device fehlt.
Ich setze gerade alles von knxWeb und linknx um auf FHEM. Jetzt bekomm ich bestimmt gleich wieder haue wenn ruediger das liest aber im linknx kann man dem Object einen Listener zu ordnen über den dann der Status angezeigt wird. Sowas fehlt leider im FHEM oder ich hab es halt noch nicht gefunden. KNX hat nun mal die schöne Funktion die Logik teilweise selbst zu machen ohne einen Rechner der es steuert. Klar könnte ich das ganze auch im FHEM nachbilden aber wenn der Rechner mal nicht läuft wären diese Funktionen weg.

Im linknx sieht das wie folgt aus. Nur ein Beispiel !! :)

<object type="1.001" id="garage_wand" gad="0/0/1" init="request">Garage Lampen Wand
            <listener gad="0/1/0" read="true"/>
        </object>

Vielleicht kann man so etwas im FHEM einbauen als attr wie gesagt falls es sowas nicht geben sollte. Vielleicht hab ich es nur nicht gefunden bis jetzt.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Andi291

Morgen!

Nene, Haue kriegst so schnell nicht.
Im Prinzip dürfte das leicht machbar sein - dafür ist FHEM ja da. Ich komme mit den Rahmenbedingungen/der Fragestellung nicht klar.

Ich nehme an, Du hast...:

1. eine GA, welche die Lampen dauerhaft schaltet (wäre dann 0/1/0 ???)
2. eine GA, welchen den Timer startet
3. eine GA, über welchen der Timer "Ausgang" die Lampen auf Zeit schaltet

Richtig? Oder willst Du FHEM als Zeitgeber einsetzen?

Grüße, Andi

ZeitlerW

Hallo Andi,

da hast Du schon recht, daß sich der state auch mit getG1 ändert.
Da habe ich mich wohl falsch ausgedrückt. Mich hat eigentlich die Anzeige in FHEM - WEB gestört und die wird ja durch einen Event des Devices getriggert.

Es muß eher heisen: Anzeige in FHEM - Web soll sich erst ändern wenn Rückmeldung kommt.

ZitatSo werden zum Beispiel Icons über beide GA umgeschalten

... also bei mir funktioniert es so wie im Eingangspost beschrieben

ZitatAktuell zeige ich bei Aktionen immer erst ein Warte-Icon

Wie hast Du das realisiert?


Zu state:

IMHO sollte sich state schon immer ändern, man hat ja auch eine Bedienung durchgeführt. Mit der Rückmeldung ändert sich dann state eigentlich nicht mehr (oder halt doch wenn die Rückmeldung unterschiedlich ist).
Da ich in meine Logiken immer nur ein Event auslöse, wenn sich getGx ändert ist für mich eigentlich alles o.k.
Wenn man allerdings in einer Logik nicht Event - getriggert den state ausliest, so hat man allerdings je nach Anwendungsfall den "falschen" Wert. Da muß man halt nicht den state, sondern das Reading getGx auslesen.
... oder habe ich da was übersehen?

lG
Wolfgang

Groej

Hallo Andi,

also sieht wie folgt aus:

eine Gruppe Lampen rechts
eine Gruppe Lampen links
eine Gruppen Treppenlicht alle Lampen

eine Gruppe Lampen rechts Status
eine Gruppe Lampen links Status

Der Aktor hat die Treppenlichtfunktion (Timer) der einfach dann angesprochen wird um die Timerfunktion zu aktivieren. Wird dieser aktiviert werden die Status Gruppen entsprechen mit gezogen. Die Funktion liegt wie geschrieben im Aktor und nicht im FHEM und dadurch wird der Status der Lampen im FHEM nicht geändert. Weil im KNX auch nicht die einzelnen Gruppen der Lampen (ein/aus) angesprochen werden sondern nur die Gruppe Treppenlicht die aber die Statusgruppen ändert.

Gruß

Jörg
FHEM - RaspPi2 - KNXD - KNX - CUL 868 - FS20 - HMS - WH3080 - Signalduino 433 MHz - Telegram - Anel Elektronik IP Steckdosen - BME280

Michael Schmidt

Danke nochmal Wolfgang für die Erleuterungen, nun habe ich vermutlich schon 90% des userreading syntax verinnerlicht. :)

Ich bin nun soweit, dass die Temperatur wenn sie als soll vom rtr zurückkommt auf dem dummy als setstate geschrieben wird.
auch die verschiedenen betriebsmodi haben nun Anwendung gefunden (der RTR hat feste sollwertverschiebungen für diese modis).

das funktioniert auch recht prima bis ich den Betriebsmodus wechsel dann kommt es zu einer schleife.
Scheinbar löst das setstate dum_buero_temperaturauswahl trotzdem ein Ereignis aus welches das doif_buero temperaturauswahl DOIF auslöst.

EDIT Scheinbar lösen die DOIF Bedingungen [dum_buero_temperaturauswahl] sowie [betriebsmodus] jeweis auch allein das DOIF aus!?

hast du eine Idee ob das so soll?
Kann ich den Syntax der 3 DOIFS mit DOELSEIF zusammenfassen?

Danke schonmal im Vorraus

Gruß
Michael

define doif_buero_temperaturauswahl_komfort DOIF ([dum_buero_temperaturauswahl] and [betriebsmodus] eq "1")(set com_buero_sollwertverschiebung value {([dum_buero_temperaturauswahl]-20)*2})
attr doif_buero_temperaturauswahl_komfort do always

define doif_buero_temperaturauswahl_standby DOIF ([dum_buero_temperaturauswahl] and [betriebsmodus] eq "2")(set com_buero_sollwertverschiebung value {([dum_buero_temperaturauswahl]-18)*2})
attr doif_buero_temperaturauswahl_standby do always

define doif_buero_temperaturauswahl_standby DOIF ([dum_buero_temperaturauswahl] and [betriebsmodus] eq "3")(set com_buero_sollwertverschiebung value {([dum_buero_temperaturauswahl]-16)*2})
attr doif_buero_temperaturauswahl_standby do always


define dum_buero_temperaturauswahl dummy
attr dum_buero_temperaturauswahl alias Solltemperatur
attr dum_buero_temperaturauswahl group Heizung
attr dum_buero_temperaturauswahl room 5 Büro
attr dum_buero_temperaturauswahl setList state:16,17,18,19,20,21,22,23,24
attr dum_buero_temperaturauswahl webCmd state

define com_buero_sollwertverschiebung EIB 3/4/4
attr com_buero_sollwertverschiebung IODev KNX
attr com_buero_sollwertverschiebung EIBreadingSender 1
attr com_buero_sollwertverschiebung group Heizung
attr com_buero_sollwertverschiebung model dpt6.010
attr com_buero_sollwertverschiebung room hidden
attr com_buero_sollwertverschiebung event-on-change-reading state

define doif_buero_temp_update DOIF ([com_buero_sollwert]) (setstate dum_buero_temperaturauswahl {([com_buero_sollwert:wert])})
attr doif_buero_temp_update do always
attr doif_buero_temp_update event-on-change-reading state

define com_buero_sollwert EIB 3/3/4
attr com_buero_sollwert IODev KNX
attr com_buero_sollwert group Heizung
attr com_buero_sollwert model tempsensor
attr com_buero_sollwert room hidden
attr com_buero_sollwert userReadings wert {ReadingsNum("com_buero_sollwert","state",0)}
 

ZeitlerW

Hallo Michael,

da müßtest Du es so machen:

define doif_buero_temperaturauswahl_komfort DOIF ([dum_buero_temperaturauswahl] and [betriebsmodus] eq "1")
(set com_buero_sollwertverschiebung value {([dum_buero_temperaturauswahl]-20)*2})
DOELSEIF ([dum_buero_temperaturauswahl] and [betriebsmodus] eq "2")
(set com_buero_sollwertverschiebung value {([dum_buero_temperaturauswahl]-18)*2})
DOELSEIF ([dum_buero_temperaturauswahl] and [betriebsmodus] eq "3")
(set com_buero_sollwertverschiebung value {([dum_buero_temperaturauswahl]-16)*2})


Dann kommt es max zu einem Schleifendurchlauf.


zu den Userreadings: Mittlerweile habe ich gelernt, daß DOIF auch mit Einheiten leben kann: http://fhem.de/commandref_DE.html#DOIF_Nutzung_von_Readings_Stati_oder_Internals_im_Ausfuehrungsteil. Du könntest anstatt eines Userreadings im Device auch im DOIF  [com_buero_sollwert:state:d] nutzen.


lG
Wolfgang

Michael Schmidt

Danke Wolfgang
Das ist ja echt Komplex mit dem RTR ;D

Ich habe den Auslöser für die schleife gefunden.

Das DOIF wir auch von der Änderung des betriebsmodus ausgelöst.
Eigentlich ist das and doch richtig gesetzt oder?

DOIF ([dum_buero_temperaturauswahl] and [betriebsmodus] eq "1")
(set com_buero_sollwertverschiebung value {([dum_buero_temperaturauswahl]-20)*2})


Gruß
Michael

ZeitlerW

Hi,

mache mal [?betriebsmodus] eq "1". Damit der Betriebsmodus - Event nicht ausgewertet wird.

... ja, da hab ich bei meinen RTRs auch ein wenig pfuschen müssen.

Ich kann ja mal meine Konfig posten:

define Wohnzimmer_Heizung_Sollwert dummy
attr Wohnzimmer_Heizung_Sollwert devStateIcon .*.:rc_BLANK:noFhemwebLink
attr Wohnzimmer_Heizung_Sollwert event-on-change-reading state
attr Wohnzimmer_Heizung_Sollwert group Wohnzimmer_Heizung
attr Wohnzimmer_Heizung_Sollwert room Wohnzimmer
attr Wohnzimmer_Heizung_Sollwert setList state:slider,16,0.5,30,1
attr Wohnzimmer_Heizung_Sollwert webCmd state
define DI_Wohnzimmer_Heizung_Sollwert DOIF ([Wohnzimmer_Heizung_RM_Sollwert_Terrassenseite])(set Wohnzimmer_Heizung_Sollwert [Wohnzimmer_Heizung_RM_Sollwert_Terrassenseite:wert])
attr DI_Wohnzimmer_Heizung_Sollwert do always
attr DI_Wohnzimmer_Heizung_Sollwert group Wohnzimmer_Heizung
attr DI_Wohnzimmer_Heizung_Sollwert room Automatik
define DI_Wohnzimmer_Heizung_Sollwert_Visu DOIF ([Wohnzimmer_Heizung_Sollwert] and [?Wohnzimmer_Heizung_Komfortbetrieb] eq "on" and [?Wohnzimmer_Heizung_sperren] eq "off")\
(set Wohnzimmer_Heizung_Sollwert_Komfort value [?Wohnzimmer_Heizung_Sollwert])\
DOELSEIF ([Wohnzimmer_Heizung_Sollwert] and [?Wohnzimmer_Heizung_Nachtbetrieb] eq "on" and [?Wohnzimmer_Heizung_sperren] eq "off")\
(set Wohnzimmer_Heizung_Sollwert_Komfort value {([?Wohnzimmer_Heizung_Sollwert])+3})\
DOELSEIF ([Wohnzimmer_Heizung_Sollwert] and [?Wohnzimmer_Heizung_sperren] eq "off")\
(set Wohnzimmer_Heizung_Sollwert_Komfort value {([?Wohnzimmer_Heizung_Sollwert])+2})\
DOELSE
attr DI_Wohnzimmer_Heizung_Sollwert_Visu cmdState Komfort|Nacht|Tag|gesperrt
attr DI_Wohnzimmer_Heizung_Sollwert_Visu do always
attr DI_Wohnzimmer_Heizung_Sollwert_Visu group Wohnzimmer_Heizung
attr DI_Wohnzimmer_Heizung_Sollwert_Visu room Automatik

lG
Wolfgang

Michael Schmidt

Super es läuft
Das ? war die Lösung! ;)

vielen Dank Wolfgang

Hast du das alles durch ausprobieren herausgefunden oder steht dir eine bessere DOKU zur verfügung  :D

Gruß
Michael