HTTPMOD für myStrom WLAN-Switches (mit attrTemplate)

Begonnen von thomasgloor, 07 April 2022, 14:50:20

Vorheriges Thema - Nächstes Thema

thomasgloor

Das api für die myStrom-WLAN Switches ist hier offiziell dokumentiert:
https://api.mystrom.ch/

Es gibt ein inoffizielles modul
https://forum.fhem.de/index.php?topic=39933.0

Dieses Modul arbeitet "blocking", was bei mir zu unschönen Verbindungsabbrüchen führt. Ich habe das Nötigste aus dem api daher als httpmod implementiert

Das Device muss vorgängig im WLAN registriert werden.

Den Code hier in in eine Datei (myStrom.template) mit Linux-Zeilenkonvention (nur LF!) im Folder /opt/fhem/FHEM/lib/AttrTemplate/ ablegen

name:MyStrom_WLAN_Switch
filter:TYPE=HTTPMOD
order:DIV99
desc: Creates a MyStrom WLAN-Switch

par:WHICHROOM;Actual room of the device, defaults to MyStrom; {AttrVal("DEVICE","room","MyStrom" )}
par:IP_ADDRESS;IP-Address of the myStrom Device;{undef}
par:TOKEN;Acces Token for the myStrom Device. <br>Inactiv until manually set;{undef}                 

attr DEVICE room WHICHROOM
attr DEVICE devStateIcon on|1:on:off off|0:off:on

attr DEVICE devStateIcon on|1:on:off off|0:off:on
attr DEVICE get10ExtractAllJSON 1
attr DEVICE get10Header01 Token: TOKEN
attr DEVICE get10Name getReport
attr DEVICE get10Poll 1
attr DEVICE get10URL http://IP_ADDRESS/report
attr DEVICE get11ExtractAllJSON 1
attr DEVICE get11Header01 Token: TOKEN
attr DEVICE get11Name getMeasuredTemperature
attr DEVICE get11Poll 0
attr DEVICE get11URL http://IP_ADDRESS/api/v1/temperature
attr DEVICE get12ExtractAllJSON 1
attr DEVICE get12Header01 Token: TOKEN
attr DEVICE get12Name getCommonSettings
attr DEVICE get12URL http://192.168.178.56/api/v1/settings
attr DEVICE get99Header01 Token: TOKEN
attr DEVICE get99Name getHelp
attr DEVICE get99Poll 0
attr DEVICE get99URL http://IP_ADDRESS/help
attr DEVICE requestHeader01 Token: TOKEN
attr DEVICE room MyStrom
attr DEVICE set01FollowGet getReport
attr DEVICE set01Header01 Token: TOKEN
attr DEVICE set01Hint 0,1
attr DEVICE set01Method GET
attr DEVICE set01Name Relay
attr DEVICE set01URL http://IP_ADDRESS/relay?state=$val
attr DEVICE set02Data {"temp_offset":"$val"}
attr DEVICE set02FollowGet getMeasuredTemperature
attr DEVICE set02Header01 Token: TOKEN
attr DEVICE set02Method POST
attr DEVICE set02Name setTemperatureOffset
attr DEVICE set02URL http://IP_ADDRESS/api/v1/settings
attr DEVICE set03Data {"name":"$val"}
attr DEVICE set03FollowGet getCommonSettings
attr DEVICE set03Header01 Token: TOKEN
attr DEVICE set03Method POST
attr DEVICE set03Name setName
attr DEVICE set03TextArg 1
attr DEVICE set03URL http://IP_ADDRESS/api/v1/settings
attr DEVICE set04Data {"token":"$val"}
attr DEVICE set04FollowGet getCommonSettings
attr DEVICE set04Header01 Token: TOKEN
attr DEVICE set04Method POST
attr DEVICE set04Name setAccesToken
attr DEVICE set04TextArg 1
attr DEVICE set04URL http://IP_ADDRESS/api/v1/settings
attr DEVICE set11FollowGet getReport
attr DEVICE set11Header01 Token: TOKEN
attr DEVICE set11Name Toggle
attr DEVICE set11NoArg 1
attr DEVICE set11URL http://IP_ADDRESS/toggle
attr DEVICE set12FollowGet getReport
attr DEVICE set12Header01 Token: TOKEN
attr DEVICE set12Method GET
attr DEVICE set12Name on
attr DEVICE set12NoArg 1
attr DEVICE set12URL http://IP_ADDRESS/relay?state=1
attr DEVICE set13FollowGet getReport
attr DEVICE set13Header01 Token: TOKEN
attr DEVICE set13Method GET
attr DEVICE set13Name off
attr DEVICE set13NoArg 1
attr DEVICE set13URL http://IP_ADDRESS/relay?state=0
attr DEVICE set20ExtractAllJSON 1
attr DEVICE set20Header01 Token: TOKEN
attr DEVICE set20Method GET
attr DEVICE set20Name setGeneralInformation
attr DEVICE set20NoArg 1
attr DEVICE set20ParseResponse 1
attr DEVICE set20URL http://IP_ADDRESS/api/v1/info
attr DEVICE set21ExtractAllJSON 1
attr DEVICE set21Header01 Token: TOKEN
attr DEVICE set21Method GET
attr DEVICE set21Name setCommonSettings
attr DEVICE set21NoArg 1
attr DEVICE set21ParseResponse 1
attr DEVICE set21URL http://IP_ADDRESS/api/v1/settings
attr DEVICE showBody 1
attr DEVICE showError 1
attr DEVICE stateFormat relay
attr DEVICE timeout 10
attr DEVICE verbose 2
attr DEVICE webCmd on:off

set DEVICE setGeneralInformation
set DEVICE setCommonSettings




Dann ein httpmod definieren

define myStromTest httpmod <ip> <intervall>

Unter "set" attrTemplate auswählen, in der Liste unter "DIV" MyStrom_WLAN_Switch auswählen. set ausführen
Es folgt die Abfrage der IP des Devices und eines "Access Tokens" (beliebiger String). "OK" setzt alle Attribute und füllt ein paar Readings ab.
Manchmal muss die Anzeige noch mit "F5" aktualisiert werden

Das Acces Token blockiert das Web-Interface des myStrom-Adapters und lässt die meisten api-Calls nur noch bei korrektem Token zu.
Das Token wird mit
set <device> setAccessToken <der beliebige String von vorher>
aktiviert. Gegen ein falsch gesetztes oder vergessenes Token hilft ein Factory Reset...

Auf die Energie- und Kostenberechnung (das Modul hat das drin) habe ich verzichtet...

Implementiert sind:

  • getReport (Statusabfrage, erfolgt alle <intervall>)
  • getMeasuredTemperature (Temperaturabfrage)
  • getCommonSettings (Allgemeine Einstellungen)
  • Relay [0,1] (aus / ein)
  • setTemperatureOffset (-30..+30)
  • setName (Name des Device (glaub DNS)
  • setAccessToken (siehe oben)
  • on (Einschalten)
  • off (Ausschalten)
  • Toggle (Statuswechsel)