Deebot Ozmo 950 [MQTT][CLOUDFREE][CLOUD][bumper][non-bumper]

Begonnen von schwatter, 15 Juni 2020, 21:42:30

Vorheriges Thema - Nächstes Thema

schwatter

Last Update: 30.10.23


Vorsicht, kein Zugriff mit Bumper nach Update auf Firmware 1.8.2. Der Port wurde von 8883 auf 443 geändert. Eine Portweiterleitung
muss ich noch testen. Cloud und FhemOnly funktioniert.



Hallo zusammen,

mit @KölnSolar's Hilfe hab ich den Deebot Ozmo 950 in Fhem integriert. Vielen Dank!


Zur Steuerung des Bot's gibt es in Bezug auf Fhem momentan 3 mir bekannte Wege. Nummer 1 ist, verwenden von Bumper.
Das erlaubt, die orig "ECOVACS HOME"-App weiter zu nutzen. Da noch ein Zertifikat auf dem Handy installiert werden muss,
ist es aber etwas tricky
. Nummer 2, Fhem only. Das ganze funktioniert ohne viel Schnickschnack. Bedeutet, kein bearbeiten
der Karte. No-go Areas z.B. sind so nicht benutzbar. SpotArea, wenn sie vorher per App eingerichtet wurden. Nummer 3, der
Weg über die Cloud mit einer kleinen Library. Damit funktionieren die Grundfunktionen des Bots  per Fhem sowie auch die App
ohne Einschränkungen.


Auf einem Blick

1. Aufbau mit Bumper [CLOUDFREE]
2. Aufbau mit Fhem only [CLOUDFREE]
3. Aufbau mit Deebotozmo (simple python library for deebot 960/950/920/T8) [CLOUD]
4. Tips


Übersicht der API-Kommandos,Konstanten und Attribute.

https://github.com/boriswerner/ecovacs-API-docs/wiki/commands-toAPI-Deebot-Ozmo-950
https://github.com/boriswerner/ecovacs-API-docs/wiki/Constants-and-Attributes-Deebot-Ozmo-950


1. Aufbau mit Bumper


Ozmo950 <---> Bumper <---> MQTT2_CLIENT <---> MQTT2_DEVICE


Infos zu Bumper und die passenden Docs:

https://github.com/bmartin5692/bumper
https://bumper.readthedocs.io/en/latest/


Setup für Bumper auf einem Pi mit Pihole (als User root)

01. Der Bot muss erst per "ECOVACS HOME"-App im Wlan eingerichtet werden. Mit Bumper habe ich es noch nicht probiert.
02. raspianOs headless einrichten
03. apt-get update && apt-get upgrade
04. Pihole für DNS umleiten installieren. Dafür gibt es viele Tuts.
05. Fritzbox einrichten wie in diesem Tut -> https://www.kuketz-blog.de/pi-hole-einrichtung-und-konfiguration-mit-fritzbox-adblocker-teil1/
06. nano /etc/dnsmasq.d/02-custom.conf

address=/ecouser.net/192.168.178.6 # ändern in euere Pihole IP
address=/ecovacs.com/192.168.178.6 # ändern in euere Pihole IP
address=/ecovacs.net/192.168.178.6 # ändern in euere Pihole IP

07. service pihole-FTL reload
08. DNS-Umleitung checken

ping ecouser.net
ping ecovacs.com
ping ecovacs.net

09. cd /opt
10. wget https://github.com/bmartin5692/bumper/archive/master.zip
11. unzip master.zip
12. cd bumper-master
13. apt-get install python3-pip
14. apt-get install pipenv
15. pip3 install -r requirements.txt
16. pipenv --three #nur zur Sicherheit
17. pipenv install
18. pipenv run python -m bumper --listen 192.168.178.6 --announce 192.168.178.6 # Zur Kontrolle, ob die Zertifikate erstellt werden.
19. bumper wieder beenden
20. nano /etc/systemd/system/bumper.service

[Unit]
Description=Bumper
After=network.target
Wants=network.target

[Service]
User=root
Restart=always
Type=simple
WorkingDirectory=/opt/bumper-master
ExecStart=pipenv run python3 -m bumper --listen 192.168.178.6 --announce 192.168.178.6

[Install]
WantedBy=multi-user.target

21. systemctl enable bumper
22. systemctl start bumper
23. shutdown -r now
24. systemctl status bumper # nach Neustart nochmal Kontrolle. Bei mir lief bumper mit ConnectionRefusedError(111).
Wahrscheinlich weil Pihole einen Moment braucht, bis die Umleitung gesetzt ist. Bumper wird zu schnell sein.
25. systemctl restart bumper
26. Klappt nix, mal den ganzen Fuhrpark neustarten. Fritzbox, Pihole, Bot,...


Jetzt der Rest in Fhem.

27. Verbindung zu Bumper wird mit MQTT2_CLIENT erstellt.

defmod myEcovacsClient MQTT2_CLIENT 192.168.178.6:8883
attr myEcovacsClient SSL 1
attr myEcovacsClient autocreate simple
attr myEcovacsClient clientId fhemuser@bumper/GLBbe7d18eG9 # die clientId muss so aufgebaut sein. Anpassen ist erlaubt.
attr myEcovacsClient mqttVersion 3.1.1
attr myEcovacsClient room Saugroboter
attr myEcovacsClient username meine@geheimemail.de # der username muss so aufgebaut sein. Anpassen ist erlaubt.

28. Dann "set myEcovacsClient password 123456" # Passwort ist egal. 123456 ist perfekt  ;D

29. Jetzt noch der Bot. Bei mir ein Ozmo950.
Dieser wird per MQTT2_DEVICE angelegt. Das Template ist noch nicht fertig.
Grundfunktionen und ein bisschen mehr sind aber gegeben.

defmod Ozmo950 MQTT2_DEVICE fhemuser_bumper_GLBbe7d18eG9
attr Ozmo950 IODev myEcovacsServer
attr Ozmo950 devicetopic bb5d3df7-0ec5-4f38-b930-b6e0ed03b963/yna5xi/GMth
attr Ozmo950 getList Battery:noArg BatteryState iot/p2p/getBattery/helperbot/bumper/helperbot/$DEVICETOPIC/q/2001/j {}\
Charging:noArg Charging iot/p2p/getChargeState/helperbot/bumper/helperbot/$DEVICETOPIC/q/2002/j {}\
Cleaning:noArg CleaningState iot/p2p/getCleanInfo/helperbot/bumper/helperbot/$DEVICETOPIC/q/2003/j {}\
Speed:noArg iot/p2p/getSpeed/helperbot/bumper/helperbot/$DEVICETOPIC/q/2004/j {}\
Error:noArg Error iot/p2p/getError/helperbot/bumper/helperbot/$DEVICETOPIC/q/2005/j {}\
LifeSpan:noArg LifeSpan iot/p2p/getLifeSpan/helperbot/bumper/helperbot/$DEVICETOPIC/q/2006/j {"body": {"data": ["brush", "sideBrush", "heap"]}\
Schedule:noArg getSched_p iot/p2p/getSched/helperbot/bumper/helperbot/$DEVICETOPIC/q/2007/j {}\
Sleep:noArg SleepState iot/p2p/getSleep/helperbot/bumper/helperbot/$DEVICETOPIC/q/2008/j {}\
Statistic:noArg getStats_p iot/p2p/getStats/helperbot/bumper/helperbot/$DEVICETOPIC/q/2009+/j {}\
Water:noArg Water iot/p2p/getWaterInfo/helperbot/bumper/helperbot/$DEVICETOPIC/q/2010/j {}\
attr Ozmo950 icon vacuum_bold
attr Ozmo950 jsonMap header_pri:0 header_tzm:0 header_ts:0 header_ver:Version header_fwVer:Firmware header_hwVer:Hardware body_data_value:BatteryState body_data_isLow:0 body_data_isCharging:Charging body_data_mode:0 body_data_trigger:Trigger body_data_state:0 body_data_speed:Speed body_data_area:CleaningArea body_data_time:0 body_data_cid:0 body_data_start:LastStart body_data_type:CleaningMode body_data_code:Systemcode body_data_left:Lifetime body_data_left:Lifetime_total body_data_enable:SleepState body_data_amount:Water body_data_1_left:LifetimeSidebrush body_data_1_total:LifetimeSidebrush_total body_data_1_type:0 body_data_2_left:LifetimeBrush body_data_2_total:LifetimeBrush_total body_data_2_type:0 body_data_3_left:LifetimeHeap body_data_3_total:LifetimeHeap_total body_data_3_type:0
attr Ozmo950 periodicCmd Battery:15
attr Ozmo950 readingList \$SYS/broker/version:.* version\
\$SYS/#:.* BrokerMessage\
\x5c\x24SYS/broker/version:.* version\
iot/atr/onPos/$DEVICETOPIC/j:.* onPos\
iot/atr/onMapTrace/$DEVICETOPIC/j:.* onMapTrace\
iot/atr/onMajorMap/$DEVICETOPIC/j:.* onMajorMap\
iot/atr/onMinorMap/$DEVICETOPIC/j:.* onMinorMap\
iot/atr/onStats/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onBattery/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onCachedMapInfo/$DEVICETOPIC/j:.* onCachedMapInfo\
iot/atr/onSched/$DEVICETOPIC/j:.* onSched\
iot/atr/onMapState/$DEVICETOPIC/j:.* onMapState\
iot/atr/reportStats/$DEVICETOPIC/j:.* reportStats\
iot/atr/reportPos/$DEVICETOPIC/j:.* reportPos\
iot/atr/reportMajorMap/$DEVICETOPIC/j:.* reportMajorMap\
iot/atr/reportMinorMap/$DEVICETOPIC/j:.* reportMinorMap\
iot/atr/reportMapTrace/$DEVICETOPIC/j:.* reportMapTrace\
iot/atr/onSpeed/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onCleanInfo/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onChargeState/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onRelocationState/$DEVICETOPIC/j:.* onRelocationState\
iot/atr/onEvt/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/[^/]+/helperbot/bumper/helperbot/$DEVICETOPIC/q/[^/]+/j:.* LastRequest\
iot/p2p/[^/]+/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* LastResponse\
iot/p2p/getAdvancedMode/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getAdvancedMode_p\
iot/p2p/getBattery/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getBlock/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getBlock_p\
iot/p2p/getBreakPoint/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getBreakPoint_p\
iot/p2p/getCachedMapInfo/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getCachedMapInfo_p\
iot/p2p/getChargeState/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getCleanInfo/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getError/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getLifeSpan/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getMajorMap/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getMajorMap_p\
iot/p2p/getMapSet/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getMapSet_p\
iot/p2p/getMapState/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getMapState_p\
iot/p2p/getMapSubSet/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getMapSubSet_p\
iot/p2p/getMapTrace/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getMapTrace_p\
iot/p2p/getMinorMap/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getMinorMap_p\
iot/p2p/getPos/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getPos_p\
iot/p2p/getRelocationState/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getRelocationState_p\
iot/p2p/getSched/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getSched_p\
iot/p2p/getSleep/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getStats/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* getStats_p\
iot/p2p/getWaterInfo/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getSpeed/$DEVICETOPIC/helperbot/bumper/helperbot/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/reportMapSubSet/$DEVICETOPIC/j:.* reportMapSubSet\
iot/atr/onSleep/$DEVICETOPIC/j:.* onSleep\
attr Ozmo950 room Saugroboter
attr Ozmo950 setList 01_CleaningAuto:start,stop iot/p2p/clean/helperbot/bumper/helperbot/$DEVICETOPIC/q/1001/j {"body": {"data": {"act": "$EVTPART1", "type": "auto"}}}\
02_CleaningSpot:0,1,2,3,4 iot/p2p/clean/helperbot/bumper/helperbot/$DEVICETOPIC/q/1002/j {"body": {"data": {"act": "start", "content": "$EVTPART1", "type": "spotArea"}}}\
03_Charging:go iot/p2p/charge/helperbot/bumper/helperbot/$DEVICETOPIC/q/1003/j {"body": {"data": {"act": "$EVTPART1"}}}\
04_BackToWorkOnOff:0,1 iot/p2p/setBreakPoint/helperbot/bumper/helperbot/$DEVICETOPIC/q/1004/j {"body": {"data": {"enable": $EVTPART1}}}\
05_Speed:1000,0,1,2 iot/p2p/setSpeed/helperbot/bumper/helperbot/$DEVICETOPIC/q/1005/j {"body": {"data": {"speed": $EVTPART1}}}\
06_AutoSpeedOnOff:0,1 iot/p2p/setCarpertPressure/helperbot/bumper/helperbot/$DEVICETOPIC/q/1006/j {"body": {"data": {"enable": $EVTPART1}}}\
07_SetWater:1,2,3,4 iot/p2p/setWaterInfo/helperbot/bumper/helperbot/$DEVICETOPIC/q/1007/j {"body": {"data": {"amount": $EVTPART1, "enable": 0}}}\
08_RestTimeOnOff:0,1 iot/p2p/setBlock/helperbot/bumper/helperbot/$DEVICETOPIC/q/1008/j {"body": {"data": {"enable": $EVTPART1}}, "header": {"tzm": 120}}\
09_RestTimeStart:selectnumbers,0,1,23,0,lin chiquer iot/p2p/setBlock/helperbot/bumper/helperbot/$DEVICETOPIC/q/1009/j {"body": {"data": {"end": "7:0", "start": "$EVTPART1:0"}}, "header": {"tzm": 120}}\
10_RestTimeEnd:selectnumbers,0,1,23,0,lin chiquer iot/p2p/setBlock/helperbot/bumper/helperbot/$DEVICETOPIC/q/1010/j {"body": {"data": {"end": "$EVTPART1:0", "start": "21:0"}}, "header": {"tzm": 120}}\
11_SetVolume:selectnumbers,0,1,10,0,lin chiquer iot/p2p/setVolume/helperbot/bumper/helperbot/$DEVICETOPIC/q/1011/j {"body": {"data": {"total": 10, "volume": $EVTPART1}}, "header": {"tzm": 120}}\
12_PlaySound:noArg iot/p2p/playSound/helperbot/bumper/helperbot/$DEVICETOPIC/q/1012/j {"body": {"data": {"count": 1, "sid": 30}}}\
13_RestTimeEndStart:textField iot/p2p/setBlock/helperbot/bumper/helperbot/$DEVICETOPIC/q/1013/j {"body": {"data": {"end": "$EVTPART1:0", "start": "$EVTPART2:0"}}, "header": {"tzm": 120}}\
attr Ozmo950 setStateList start stop
attr Ozmo950 stateFormat ActualStatus: LastResponse
attr Ozmo950 subType Saugroboter
attr Ozmo950 webCmd 01_CleaningAuto:02_CleaningSpot:03_Charging:14_move
attr Ozmo950 webCmdLabel cleaning_normal:cleaning_spot:return_to_charge



2. Aufbau mit Fhem only


Ozmo950 <---> MQTT2_SERVER <---> MQTT2_DEVICE


Übersicht der API_Kommandos

https://github.com/boriswerner/ecovacs-API-docs/wiki/commands-toAPI-Deebot-Ozmo-950


01. Pihole wie oben beschrieben einrichten (Schritte 01-08). Wichtig, IP vo Fhemserver verwenden.
02. Neu, seit dem Update auf Firmware 1.8.2 hat sich der MQTT-Port von 8883 auf 443 geändert. Daher muss jetzt per iptables geroutet werden.

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to 8883
Funktioniert der Befehl nicht, dann muss im System ip_forward aktiviert werden. Hier Ubuntu.

echo "1" > /proc/sys/net/ipv4/ip_forward

03. MQTT2-SERVER als Broker einrichten. SSL und Port sind wichtig, ein Passwort aber nicht.

defmod myEcovacsServer MQTT2_SERVER 8883 global
attr myEcovacsServer SSL 1
attr myEcovacsServer autocreate simple
attr myEcovacsServer room Saugroboter
attr myEcovacsServer sslVersion TLSv12

04. Da die APP ohne Bumper nicht funktioniert, einmal am Bot die Starttaste drücken.
05. Jetzt sollte ein neues MQTT2_DEVICE automatisch angelegt werden.

defmod MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth MQTT2_DEVICE bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth
attr MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth IODev myEcovacsServer
attr MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth readingList bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth:iot/atr/onSleep/bb5d3df7-0ec5-4f38-b930-b6e0ed03b963/yna5xi/GMth/j:.* { json2nameValue($EVENT) }\
bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth:iot/atr/onChargeState/bb5d3df7-0ec5-4f38-b930-b6e0ed03b963/yna5xi/GMth/j:.* { json2nameValue($EVENT) }
attr MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth room MQTT2_DEVICE

setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 body_data_enable 1
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 body_data_isCharging 1
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 body_data_mode slot
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_fwVer 1.7.9
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_hwVer 0.1.1
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_pri 1
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_ts 1592718855046
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_tzm 480
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_ver 0.0.1

05. Das angelegte Device dann erweitern (setList, getList, readingList,...,...).

defmod Ozmo950 MQTT2_DEVICE bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth
attr Ozmo950 IODev myEcovacsServer
attr Ozmo950 devicetopic bb5d3df7-0ec5-4f38-b930-b6e0ed03b963/yna5xi/GMth
attr Ozmo950 getList Battery:noArg BatteryState iot/p2p/getBattery/x/y/z/$DEVICETOPIC/q/2001/j {}\
Charging:noArg Charging iot/p2p/getChargeState/x/y/z/$DEVICETOPIC/q/2002/j {}\
Cleaning:noArg CleaningState iot/p2p/getCleanInfo/x/y/z/$DEVICETOPIC/q/2003/j {}\
Speed:noArg iot/p2p/getSpeed/x/y/z/$DEVICETOPIC/q/2004/j {}\
Error:noArg Error iot/p2p/getError/x/y/z/$DEVICETOPIC/q/2005/j {}\
LifeSpan:noArg LifeSpan iot/p2p/getLifeSpan/x/y/z/$DEVICETOPIC/q/2006/j {"body": {"data": ["brush", "sideBrush", "heap"]}}\
Schedule:noArg getSched_p iot/p2p/getSched/x/y/z/$DEVICETOPIC/q/2007/j {}\
Sleep:noArg SleepState iot/p2p/getSleep/x/y/z/$DEVICETOPIC/q/2008/j {}\
Statistic:noArg getStats_p iot/p2p/getStats/x/y/z/$DEVICETOPIC/q/2009+/j {"header": {"ts": "1591972654686", "ver": "0.0.22", "pri": 2, "tzm": 120}}\
Water:noArg Water iot/p2p/getWaterInfo/x/y/z/$DEVICETOPIC/q/2010/j {}

\
attr Ozmo950 icon vacuum_bold
attr Ozmo950 jsonMap header_pri:0 header_tzm:0 header_ts:0 header_ver:Version header_fwVer:Firmware header_hwVer:Hardware body_data_value:BatteryState body_data_isLow:0 body_data_isCharging:Charging body_data_mode:0 body_data_trigger:Trigger body_data_state:0 body_data_speed:Speed body_data_area:CleaningArea body_data_time:0 body_data_cid:0 body_data_start:LastStart body_data_type:CleaningMode body_data_code:Systemcode body_data_left:Lifetime body_data_left:Lifetime_total body_data_enable:SleepState body_data_amount:Water body_data_1_left:LifetimeSidebrush body_data_1_total:LifetimeSidebrush_total body_data_1_type:0 body_data_2_left:LifetimeBrush body_data_2_total:LifetimeBrush_total body_data_2_type:0 body_data_3_left:LifetimeHeap body_data_3_total:LifetimeHeap_total body_data_3_type:0 body_data_cleanState_motionState:0 body_msg:MessageErrorCode
attr Ozmo950 periodicCmd Battery:15
attr Ozmo950 readingList \$SYS/broker/version:.* version\
\$SYS/#:.* BrokerMessage\
\x5c\x24SYS/broker/version:.* version\
iot/atr/onPos/$DEVICETOPIC/j:.* onPos\
iot/atr/onMapTrace/$DEVICETOPIC/j:.* onMapTrace\
iot/atr/onMajorMap/$DEVICETOPIC/j:.* onMajorMap\
iot/atr/onMinorMap/$DEVICETOPIC/j:.* onMinorMap\
iot/atr/onStats/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onBattery/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onCachedMapInfo/$DEVICETOPIC/j:.* onCachedMapInfo\
iot/atr/onSched/$DEVICETOPIC/j:.* onSched\
iot/atr/onMapState/$DEVICETOPIC/j:.* onMapState\
iot/atr/reportStats/$DEVICETOPIC/j:.* reportStats\
iot/atr/reportPos/$DEVICETOPIC/j:.* reportPos\
iot/atr/reportMajorMap/$DEVICETOPIC/j:.* reportMajorMap\
iot/atr/reportMinorMap/$DEVICETOPIC/j:.* reportMinorMap\
iot/atr/reportMapTrace/$DEVICETOPIC/j:.* reportMapTrace\
iot/atr/onSpeed/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onCleanInfo/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onChargeState/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/onRelocationState/$DEVICETOPIC/j:.* onRelocationState\
iot/atr/onEvt/$DEVICETOPIC/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/[^/]+/x/y/z/$DEVICETOPIC/q/[^/]+/j:.* LastRequest\
iot/p2p/[^/]+/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* LastResponse\
iot/p2p/getAdvancedMode/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getAdvancedMode_p\
iot/p2p/getBattery/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getBlock/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getBlock_p\
iot/p2p/getBreakPoint/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getBreakPoint_p\
iot/p2p/getCachedMapInfo/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getCachedMapInfo_p\
iot/p2p/getChargeState/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getCleanInfo/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getError/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getLifeSpan/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getMajorMap/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getMajorMap_p\
iot/p2p/getMapSet/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getMapSet_p\
iot/p2p/getMapState/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getMapState_p\
iot/p2p/getMapSubSet/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getMapSubSet_p\
iot/p2p/getMapTrace/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getMapTrace_p\
iot/p2p/getMinorMap/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getMinorMap_p\
iot/p2p/getPos/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getPos_p\
iot/p2p/getRelocationState/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getRelocationState_p\
iot/p2p/getSched/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getSched_p\
iot/p2p/getSleep/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getStats/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* getStats_p\
iot/p2p/getWaterInfo/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/p2p/getSpeed/$DEVICETOPIC/x/y/z/p/[^/]+/j:.* { json2nameValue($EVENT,"",$JSONMAP) }\
iot/atr/reportMapSubSet/$DEVICETOPIC/j:.* reportMapSubSet\
iot/atr/onSleep/$DEVICETOPIC/j:.* onSleep
attr Ozmo950 room MQTT2_DEVICE,Saugroboter
attr Ozmo950 setList 01_CleaningAuto:start,stop iot/p2p/clean/x/y/z/$DEVICETOPIC/q/1001/j {"body": {"data": {"act": "$EVTPART1", "type": "auto"}}}\\
02_CleaningSpot:0,1,2,3,4 iot/p2p/clean/x/y/z/$DEVICETOPIC/q/1002/j {"body": {"data": {"act": "start", "content": "$EVTPART1", "type": "spotArea"}}}\\
03_Charging:go iot/p2p/charge/x/y/z/$DEVICETOPIC/q/1003/j {"body": {"data": {"act": "$EVTPART1"}}}\\
04_BackToWorkOnOff:0,1 iot/p2p/setBreakPoint/x/y/z/$DEVICETOPIC/q/1004/j {"body": {"data": {"enable": $EVTPART1}}}\\
05_Speed:1000,0,1,2 iot/p2p/setSpeed/x/y/z/$DEVICETOPIC/q/1005/j {"body": {"data": {"speed": $EVTPART1}}}\\
06_AutoSpeedOnOff:0,1 iot/p2p/setCarpertPressure/x/y/z/$DEVICETOPIC/q/1006/j {"body": {"data": {"enable": $EVTPART1}}}\\
07_SetWater:1,2,3,4 iot/p2p/setWaterInfo/x/y/z/$DEVICETOPIC/q/1007/j {"body": {"data": {"amount": $EVTPART1, "enable": 0}}}\\
08_RestTimeOnOff:0,1 iot/p2p/setBlock/x/y/z/$DEVICETOPIC/q/1008/j {"body": {"data": {"enable": $EVTPART1}}, "header": {"tzm": 120}}\\
09_RestTimeStart:selectnumbers,0,1,23,0,lin chiquer iot/p2p/setBlock/x/y/z/$DEVICETOPIC/q/1009/j {"body": {"data": {"end": "7:0", "start": "$EVTPART1:0"}}, "header": {"tzm": 120}}\\
10_RestTimeEnd:selectnumbers,0,1,23,0,lin chiquer iot/p2p/setBlock/x/y/z/$DEVICETOPIC/q/1010/j {"body": {"data": {"end": "$EVTPART1:0", "start": "21:0"}}, "header": {"tzm": 120}}\\
11_SetVolume:selectnumbers,0,1,10,0,lin chiquer iot/p2p/setVolume/x/y/z/$DEVICETOPIC/q/1011/j {"body": {"data": {"total": 10, "volume": $EVTPART1}}, "header": {"tzm": 120}}\\
12_PlaySound:noArg iot/p2p/playSound/x/y/z/$DEVICETOPIC/q/1012/j {"body": {"data": {"count": 1, "sid": 30}}}\\
13_RestTimeEndStart:textField iot/p2p/setBlock/x/y/z/$DEVICETOPIC/q/1013/j {"body": {"data": {"end": "$EVTPART1:0", "start": "$EVTPART2:0"}}, "header": {"tzm": 120}}
attr Ozmo950 setStateList start stop
attr Ozmo950 stateFormat ActualStatus: LastResponse
attr Ozmo950 subType Saugroboter
attr Ozmo950 webCmd 01_CleaningAuto:02_CleaningSpot:03_Charging
attr Ozmo950 webCmdLabel cleaning_normal:cleaning_spot:return_to_charge



3. Aufbau mit Deebotozmo (simple python library for deebot 960/950/920/T8)



Ozmo950 <---> CLOUD <---> Deebotozmo  <--> Dummy

Infos sind hier zu finden.

https://github.com/And3rsL/Deebotozmo



01. Deebotozmo installieren

pip3 install deebotozmo==1.7.1
02. Fehlende Abhängigkeiten installieren. Bei mir

sudo apt-get install libatlas-base-dev
sudo apt-get install libopenjp2-7
sudo apt-get install libtiff5

03. Config erstellen

root@pi3Pihole:~# deebotozmo createconfig
Ecovacs app email: your@mail.de
Ecovacs app password: supergeheimespasswort
your two-letter country code [de]: de
your two-letter continent code [eu]: eu
Verify SSL for API requests [True]: True

04. Zum testen im Terminal

deebotozmo clean
Jetzt sollte der Bot saugen

05. Übersicht der Befehle

root@pi3Pihole:~# deebotozmo --help
Usage: deebotozmo [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...

Options:
  --debug / --no-debug
  --help                Show this message and exit.

Commands:
  charge         Returns to charger
  clean          Auto clean
  components     Get robot components life span
  createconfig   logs in with specified email; run this first
  customarea     Cleans provided area(s), ex: "-602,1812,800,723"
  dodebug        debug function, do not use :)
  exportlivemap  Get robot map and save it [filepath ex:...
  getcleanlogs   Get Clean Logs
  getrooms       Get saved rooms
  pause          pause the robot
  playsound      Play welcome sound
  resume         Resume the robot
  setfanspeed    Set Clean Speed
  setwaterlevel  Set Water Level
  spotarea       Cleans provided rooms(s), ex: "0,1" | Use GetRooms to see...
  statuses       Get robot statuses [Status,Battery,FanSpeed,WaterLevel]
root@pi3Pihole:~#

06. Dummy in Fhem anlegen

defmod DeebotOzmo950 dummy
attr DeebotOzmo950 readingList state
attr DeebotOzmo950 room 04.Esszimmer_EG
attr DeebotOzmo950 setList 01_CleaningAuto:clean,pause,resume,charge 02_SpotArea:selectnumbers,0,1,9,0,lin 03_Fanspeed:quiet,normal,max,max+ 04_WaterFlowRate:low,medium,high,ultrahigh 05_Systeminfos:components,getrooms,statuses 06_GetMap:noArg
attr DeebotOzmo950 stateFormat LastActivity:state<br><br>\
statuses<br>\
<a href="http://192.168.178.66:8085/fhem/www/livemap/map.png"><img src="/fhem/www/livemap/map.png?nocache=<?time();; ?>" style="width: 100%;;max-height: 100%"> </a>
attr DeebotOzmo950 webCmd 01_CleaningAuto:02_SpotArea:03_Fanspeed:05_Systeminfos:06_GetMap
attr DeebotOzmo950 webCmdLabel BasicCmd::SpotArea::Fanspeed::Vacuumdetails::Mapdater:

setstate DeebotOzmo950 LastActivity:05_Systeminfos statuses<br><br>\
Vacuum Status: STATE_DOCKED\
Battery: 100%\
Fan Speed: normal\
Water Level: low\
<br>\
<img src="/fhem/www/livemap/map.png?nocache=<?time(); ?>">"
setstate DeebotOzmo950 2020-09-24 21:58:58 components brush: 92.50555555555555%\
sideBrush: 83.91111111111111%\
heap: 81.26388888888889%\

setstate DeebotOzmo950 2020-09-24 22:02:21 state 05_Systeminfos statuses
setstate DeebotOzmo950 2020-09-24 22:02:24 statuses Vacuum Status: STATE_DOCKED\
Battery: 100%\
Fan Speed: normal\
Water Level: low\

07. Und ein paar notify's für die Cmd's

defmod DeebotOzmo950_Cmd01 notify DeebotOzmo950:01_CleaningAuto.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;system("sudo deebotozmo $botcmd &")}defmod DeebotOzmo950_Cmd02 notify DeebotOzmo950:02_SpotArea.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;system("sudo deebotozmo spotarea $botcmd 1 &")}defmod DeebotOzmo950_Cmd03 notify DeebotOzmo950:03_Fanspeed.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;system("sudo deebotozmo setfanspeed $botcmd &")}defmod DeebotOzmo950_Cmd04 notify DeebotOzmo950:04_WaterFlowRate.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;system("sudo deebotozmo setwaterlevel $botcmd &")}defmod DeebotOzmo950_Cmd05 notify DeebotOzmo950:05_Systeminfos.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;my $result = qx "sudo deebotozmo $botcmd &";;;; fhem("setreading DeebotOzmo950 $botcmd $result");;;;}defmod DeebotOzmo950_Cmd06 notify DeebotOzmo950:06_GetMap {fhem(system("sudo deebotozmo exportlivemap /opt/fhem/www/livemap/map.png & "))} ; sleep 15 ; { map { FW_directNotify("#FHEMWEB:$_", "location.reload('true')", "") } devspec2array("WEB.*") };;

Info zu GetMap
Die Map braucht ca. 15 sek. bis sie geladen ist und in Fhem zur Verfügung steht, daher ein sleep 15 im Anschluss. Danach ist ein Browserrefresh nötig, um das
Bild zu aktualisieren. Das erfolgt per Aufruf von FW_directNotify. So wie es oben im Notify ausgeführt wird, erfolgt ein Refresh von allen WEB.* Instanzen.
Wer das nicht möchte, muss den Filter anpassen.

Siehe:
https://wiki.fhem.de/wiki/DevelopmentFHEMWEB-API

08. Ein at für Statusupdates

defmod DeebotOzmo950_Updates at +*00:10:00 set DeebotOzmo950 05_Systeminfos statuses
09. Ordner anlegen für die Map

/opt/fhem/www/livemap
10. Berechtigungen damit Fhem Shellbefehle ausführen bzw den Roboter steuern darf.

Von Haus aus hat Fhem keine Erlaubnis, tiefgreifende Shellbefehle ausführen zu dürfen. Deshalb muss in diesem Fall folgendes erledigt werden.


Pfad der Bin-Datei ermitteln.

which deebotozmo
Dann die Berechtigungsdatei erstellen.

sudo nano /etc/sudoers.d/011_fhem-nopasswd
Folgendes einfügen und speichern. Gegebenenfalls neustarten.

fhem ALL=(ALL) NOPASSWD: /pfad/der/gerade/ermittelt/wurde

Weitere Infos dazu:

https://forum.fhem.de/index.php/topic,112149.msg1122934.html#msg1122934
https://heinz-otto.blogspot.com/2017/08/raspberry-ausschalten-mit-fhem.html

Danke Otto123 für das aufbereiten.


4. Tips


01. Da der Bot nicht viel redet, empfiehlt es sich bei MQTT ein periodicCmd anzulegen.

attr Ozmo950 periodicCmd Battery:15

Damit wird im interval von 15min Battery abgefragt.

02. Die "ECOVACS HOME"-App

- funktionierte bei mir nur bis 1.4.5
- Wenn der Bot als offline angezeigt wird, App beenden und neustarten.
- Oder in der App runterziehen, so dass aktualisiert wird.
- Der Dienst der App läuft im Hintergrund. Funktioniert nichts, die App unter Einstellungen --> Apps suchen und beenden erzwingen. Speicher + Cache löschen.

schwatter

@KölnSolar

Ich war ein paar Tage weg. Nu können wir es fortsetzen.

KölnSolar

RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

schwatter

Aso, ja. Ohne Bumper. Die Readings werden nebenbei fertig.

KölnSolar

Na dann probieren wir es mal. Als erstes mal ganz ohne Zertifikat/Key. Da blick ich bei mir nämlich nicht mehr so recht durch.  ::) :-[

bumper stoppen.

Den Server so anlegendefmod myEcovacsServer MQTT2_SERVER 8883 global
attr myEcovacsServer autocreate simple
attr myEcovacsServer room Saugroboter


Änderung des IODev beim MQTT2-device(sicherheitshalber das nicht mehr benötigte MQTT2-client-device löschen)
attr Ozmo950 IODev myEcovacsServer
Bot aus, kurz warten u. wieder ein.

Ich vermute es passiert .....nichts.

Daher die TLS-Verschlüsselung beim Server aktivieren.

attr myEcovacsServer SSL 1
attr myEcovacsServer sslVersion TLSv12

Bot aus, kurz warten u. wieder ein.

Und verbunden ? Wenn nicht brauchen wir noch das Zertifikat.(Info gebe ich dann)

Als Schmankerl könntest Du mal gucken, ob Du den 950 zum Tanzen bekommst. Musst es natürlich auf JSON umbauen.
move:backward,forward,SpinLeft,SpinRight,TurnAround,stop iot/p2p/Move/helperbot/bumper/helperbot/$DEVICETOPIC/q/1119/x <ctl td="Move"><move action="$EVTPART1"/></ctl>

Have fun
Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

schwatter

Ok, alles so eingerichtet. Kein Mucks. Ich habe jetzt alle Zertifikate nach
/opt/fhem/certs geschoben. Gruppe dialout, Eigentümer fhem.

KölnSolar

 aus dem certs-Verzeichnis das bumper.key u. bumper.crt in das ggfs. neu zu erstellende Verzeichnis certs unterhalb des FHEM-Hauptverzeichnisses kopieren
umbenennen in bumper-key.pem bzw. bumper-cert.pem(ich hoffe die sind schon im pem-Format sonst müssten sie umgewandelt werden  :()

und noch ein Attribut
attr myEcovacsServer sslCertPrefix certs/bumper-
Hier ist vermutlich ein modify oder shutdown/restart erforderlich.

Ich bin gespannt....
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

schwatter

So, die gute Nachricht. Es funktioniert  :D
Die schlechte Nachricht. Wir Beide haben die Info vergessen, den DNS auf Fhem zu setzen zu erwähnen.
Ist selbstverständlich, aber ja. Nochmal Rolle rückwärts und schauen ob es ohne Zertifikat funktioniert.
Melde mich gleich.

KölnSolar

ZitatDie schlechte Nachricht. Wir Beide haben die Info vergessen, den DNS auf Fhem zu setzen zu erwähnen.
Ich nicht. Bei mir liefen bumper u. FHEM auf der selben Hardware.  ;) Dann muss man nichts ändern.

Zitatdie gute Nachricht. Es funktioniert 
Prima. 8)
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

schwatter

ZitatIch nicht. Bei mir liefen bumper u. FHEM auf der selben Hardware.  ;) Dann muss man nichts ändern.

touché  ;D

Ok, alle Zertifikate gelöscht. Und diverse Neustarts. Läuft.

attr myEcovacsServer sslVersion TLSv12

Habe herausgefunden, das MQTT2-SERVER das als Standard gesetzt hat. Es wäre also
nicht erforderlich. Aber, ich nehme es mit auf. Dinge ändern sich mit der Zeit.

KölnSolar

ZitatOk, alle Zertifikate gelöscht. Und diverse Neustarts. Läuft.
Ha, hätte ich nicht mit gerechnet. D.h. ja, dass unsere Nachfolger kein bumper, kein pip, kein pipenv, kein python3 installieren müssen. 8) 8) 8)
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

schwatter

Ja, genau  :)
Ich werde das Morgen nochmal zwecks MQTT2_DEVICE und autocreate nachstellen.
Heute nach dem löschen vom Device wurde nach einem Neustart kein neues Device angelegt.

Vielleicht, weil der Bot so wenig sendet, wenn er nicht in Betrieb ist. Hab aber gerade Sperrstunde  :P

schwatter

Moin,

der Bot meldet sich nicht, ohne das ich was mache. Nachdem ich den Button auf ihm kurz
gedrückt habe, wird er aber per autocreate angelegt.

defmod MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth MQTT2_DEVICE bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth
attr MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth IODev myEcovacsServer
attr MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth readingList bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth:iot/atr/onSleep/bb5d3df7-0ec5-4f38-b930-b6e0ed03b963/yna5xi/GMth/j:.* { json2nameValue($EVENT) }\
bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth:iot/atr/onChargeState/bb5d3df7-0ec5-4f38-b930-b6e0ed03b963/yna5xi/GMth/j:.* { json2nameValue($EVENT) }
attr MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth room MQTT2_DEVICE

setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 body_data_enable 1
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 body_data_isCharging 1
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 body_data_mode slot
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_fwVer 1.7.9
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_hwVer 0.1.1
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_pri 1
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_ts 1592718855046
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_tzm 480
setstate MQTT2_bb5d3df7_0ec5_4f38_b930_b6e0ed03b963_yna5xi_GMth 2020-06-21 07:54:20 header_ver 0.0.1



Aber auch danach, keine Aktualisierung. Erst wenn er gestartet wird. Getreu dem Motto,
klotzen statt kleckern.


KölnSolar

ZitatAber auch danach, keine Aktualisierung. Erst wenn er gestartet wird. Getreu dem Motto,
klotzen statt kleckern.
Hatten wir ja schon zu Beginn so, dass der 950 nicht so gesprächig ist wie mein Slim10. Kannst ja mal ein zyklisches at mit get Ozmo950 Battery anlegen.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

schwatter

Ja, gute Idee. Werde ein at anlegen und bald Post 1 überarbeiten.