KNX readingProxy für Dimmer und alexaFHEM

Begonnen von kolimbo, 05 Januar 2020, 22:12:36

Vorheriges Thema - Nächstes Thema

kolimbo

Hallo Zusammen,

gerne möchte ich einen KNX Dimmer mit FHEM über einen Amazon Echo Show steuern. Die Spracheingabe funktioniert. Problem: Die Eingabe über Touchscreen funktioniert nicht wie sie soll.

Es gibt zwei Devices:
1. Ein KNX Device mit dpt5.001 Datentyp "out of the Box"
2. Einen abstrahierenden "virtuellen" readingsProxy


defmod DG_WOHNEN_AMBIENT KNX 1/0/226:dpt5.001
attr DG_WOHNEN_AMBIENT room KNX
attr DG_WOHNEN_AMBIENT IODev tul

defmod livingroom_light readingsProxy DG_WOHNEN_AMBIENT:state
attr livingroom_light room Virtual
attr livingroom_light genericDeviceType light

attr livingroom_light setList brightness:slider,0,1,100 on off
attr livingroom_light setFn { if ($CMD eq "on") {\
fhem ("set $DEVICE g1 100");;\
} elsif ($ARGS =~ /^([0-9]|[1-9][0-9]|100)$/) {\
fhem ("set $DEVICE g1 " . $ARGS);;\
} else {\
fhem ("set $DEVICE g1 0");;\
}\
return undef\
}
attr livingroom_light userReadings power {if(ReadingsVal("livingroom_light","state",0) == 0) {return "off"} else {return "on"}}
attr livingroom_light event-on-change-reading state,power

attr livingroom_light alexaName livingroom light
attr livingroom_light homebridgeMapping clear\
On=power,valueOff=off,cmdOff=off,cmdOn=on,nocache=true\
Brightness=brightness::state,minValue=0,maxValue=100,cmd=brightness\


Es werden jetzt ein BrightnessController und ein PowerController mit ihren namespaces an Alexa gemeldet:

[1/5/2020, 9:16:39 PM] posting skill event
[1/5/2020, 9:16:39 PM] {"event":{"header":{"namespace":"Alexa.Discovery","name":"AddOrUpdateReport","payloadVersion":"3","messageId":"XXXX"},"payload":{"endpoints":[{"endpointId":"XXXX","manufacturerName":"readingsProxy","description":"n: livingroom_light, r: virtual","friendlyName":"livingroom light","displayCategories":["LIGHT"],"additionalAttributes":{"manufacturer":"FHEM","model":"<unknown>"},"capabilities":[{"type":"AlexaInterface","interface":"Alexa.BrightnessController","version":"3","properties":{"supported":[{"name":"brightness"}],"proactivelyReported":false,"retrievable":true}},{"type":"AlexaInterface","interface":"Alexa.PowerController","version":"3","properties":{"supported":[{"name":"powerState"}],"proactivelyReported":false,"retrievable":true}}],"cookie":{"device":"livingroom_light","fuuid":"XXXX"}}],"scope":{"type":"BearerToken","token":"access-token-from-Amazon"}}}}


Schaltet man den Dimmer jetzt über das Lampensymbol des Touchscreens aus, bekommt der Slider auf dem Display kein Update für den Bildschirm-Slider:

[1/5/2020, 9:49:21 PM] >>>> [ssh] {"directive":{"header":{"namespace":"Alexa.PowerController","name":"TurnOff","payloadVersion":"3","messageId":"XXXX","correlationToken":"-"},"endpoint":{"scope":{"type":"BearerToken","token":"XXXX"},"endpointId":"XXXX","cookie":{"fuuid":"XXXX","device":"livingroom_light"}},"payload":{}}}
[1/5/2020, 9:49:21 PM] [FHEM] livingroom_light: executing set cmd for On with value 0
[1/5/2020, 9:49:21 PM] [FHEM]   executing: http://127.0.0.1:8083/fhem?cmd=set%20livingroom_light%20off&fwcsrf=csrf_XXXX&XHR=1
[1/5/2020, 9:49:21 PM] <<<< [ssh] {"context":{"properties":[{"namespace":"Alexa.PowerController","name":"powerState","value":"OFF","timeOfSample":"2020-01-05T20:49:21.420Z","uncertaintyInMilliseconds":500}]},"event":{"header":{"namespace":"Alexa","name":"Response","payloadVersion":"3","messageId":"XXXX","correlationToken":"-"},"endpoint":{"scope":{"type":"BearerToken","token":"XXXX"},"endpointId":"XXXX"},"payload":{}}}
  2020-01-05 21:49:21 caching: livingroom_light-state: 0 %
[1/5/2020, 9:49:21 PM] [FHEM]     caching: Brightness: 0 % (as string; from '0 %')
  2020-01-05 21:49:21 caching: livingroom_light-power: off
[1/5/2020, 9:49:21 PM] [FHEM]     caching: On: 0 (as number; from 'off')


Es wäre hilfreich, wenn ein proaktives Update für den BrightnessController an alexa gesendet würde.

Meine Fragen:
.) Wie kann der Alexa Echo Dimmer (Slider+Schalter) in FHEM besser modelliert bzw. angesprochen werden?
.) Ist es auch zukünftig ok, beim KNX-Device (eine Gruppenadresse) auf "state" und nicht auf die "getG1"/"setG1" readings zuzugreifen?
.) Wie werde ich bei userReadings den harten Verweis auf "livingroom_light" los, etwa durch Selbstreferenzierung per Variablen?

Für andere Ideen oder für einen Hinweis wäre ich dankbar.

Viele Grüße,

Jörg

Edit 06.1.2020: Device Definition als Code-Block komplettiert, konkrete Fragen, Überschrift

KernSani

Hallo Kolimbo,
willkommen im Forum :-) Ich fürchte deine Fragen sind im Anfängerforum eher falsch eingeordnet. Tatsächlich denke, ich sind es drei Fragen für drei Foren:
1.) Sprachsteuerung für die Alexa Themen
2.) KNX für KNX
3.) userreading - das sollte hier passen, wenn ich das richtig sehe, willst du eigentlich $name haben statt  "livingroom_light" haben, oder?

Grüße,

Oli
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

kolimbo

Hallo Oli,

danke für die Antwort! Die Systemvariable $NAME hat funktioniert (aber auch $name). Das Anfängerforum hatte ich (nunja) als Anfänger gewählt, da ich einige Konzepte von fhem offenbar noch nicht richtig verstanden habe.

Durch Tests ergibt sich, dass zur Frage 2) wohl bei KNX Devices das Reading getG1 richtig wäre, da es den tatsächlichen vom Aktor gemeldeten Dimmwert enthält. Im Zusammenhang mit dem Alexa Smarthome Skill wird der Wert scheinbar zu spät aktualisiert. Tatsächlich wird in meinem Beispiel derzeit immer der Wert von "state" des readingsproxy übermittelt.

Ich nehme an, dass der Fehler im homebridgeMapping liegt, da weder proaktive Updates in Richtung Alexa erfolgen (dann würde es auch mit getG1 funktionieren) noch die Werte minValue und maxValue irgendwelche Auswirkungen zeigen. Nur der erste Teil "Brightness=brightness::state" scheint zu wirken. Gerne frage ich dazu im entsprechenden Forum nach.

Der Vollständigkeit halber eine Korrektur/Verbesserung:

attr livingroom_light setFn { if ($CMD eq "on") {\
     fhem ("set $DEVICE g1 100");; }\
   elsif ($CMD eq "brightness") {\
     if ($ARGS =~ /^([0-9]|[1-9][0-9]|100)$/) {\
          fhem ("set $DEVICE g1 " . $ARGS);; }\
     }\
   else {\
          fhem ("set $DEVICE g1 0");;}\
  return undef\
}


Vielen Dank für die Unterstützung,

Jörg