Verschiedenes > Bastelecke

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

(1/24) > >>

schwatter:
#############################################################
Vorsicht, kein Zugriff mit Bumper oder direkt per MQTT nach Update auf Firmware 1.8.2
Cloud 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. Aber, der Bot teilt die Karte selber in Areas ein. Daher funktionert spotArea
trotzdem. 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


 
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://heikorichter.name/post/129/fritzbox-mit-pi-hole-und-dns-over-htttps/
06. nano /etc/dnsmasq.d/02-custom.conf


--- Code: ---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

--- Ende Code ---

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


--- Code: ---ping ecouser.net
ping ecovacs.com
ping ecovacs.net

--- Ende Code ---

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


--- Code: ---[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

--- Ende Code ---

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.


--- Code: ---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.

--- Ende Code ---

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.


--- Code: ---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

--- Ende Code ---



2. Aufbau mit Fhem only


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


01. Pihole wie oben beschrieben einrichten (Schritte 01-08).
02. MQTT2-SERVER als Broker einrichten. SSL und Port sind wichtig, ein Passwort aber nicht.


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

--- Ende Code ---

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


--- Code: ---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

--- Ende Code ---

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


--- Code: ---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

--- Ende Code ---



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


--- Code: ---pip3 install deebotozmo
--- Ende Code ---

02. Fehlende Abhängigkeiten installieren. Bei mir


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

--- Ende Code ---

03. Config erstellen


--- Code: ---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
--- Ende Code ---

04. Zum testen im Terminal


--- Code: ---deebotozmo clean
--- Ende Code ---

Jetzt sollte der Bot saugen

05. Übersicht der Befehle


--- Code: ---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:~#
--- Ende Code ---

06. Dummy in Fhem anlegen


--- Code: ---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&#58;:SpotArea&#58;:Fanspeed&#58;:Vacuumdetails&#58;:Mapdater&#58;

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\

--- Ende Code ---

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


--- Code: ---defmod DeebotOzmo950_Cmd01 notify DeebotOzmo950:01_CleaningAuto.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;system("sudo deebotozmo $botcmd &")}
--- Ende Code ---

--- Code: ---defmod DeebotOzmo950_Cmd02 notify DeebotOzmo950:02_SpotArea.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;system("sudo deebotozmo spotarea $botcmd 1 &")}
--- Ende Code ---

--- Code: ---defmod DeebotOzmo950_Cmd03 notify DeebotOzmo950:03_Fanspeed.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;system("sudo deebotozmo setfanspeed $botcmd &")}
--- Ende Code ---

--- Code: ---defmod DeebotOzmo950_Cmd04 notify DeebotOzmo950:04_WaterFlowRate.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;system("sudo deebotozmo setwaterlevel $botcmd &")}
--- Ende Code ---

--- Code: ---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");;;;}
--- Ende Code ---

--- Code: ---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.*") };;

--- Ende Code ---

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


--- Code: ---defmod DeebotOzmo950_Updates at +*00:10:00 set DeebotOzmo950 05_Systeminfos statuses
--- Ende Code ---

09. Ordner anlegen für die Map


--- Code: ---/opt/fhem/www/livemap
--- Ende Code ---

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.


--- Code: ---which deebotozmo
--- Ende Code ---

Dann die Berechtigungsdatei erstellen.


--- Code: ---sudo nano /etc/sudoers.d/011_fhem-nopasswd
--- Ende Code ---

Folgendes einfügen und speichern. Gegebenenfalls neustarten.


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


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.


--- Code: ---attr Ozmo950 periodicCmd Battery:15

--- Ende Code ---

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:
womit ? mqtt2-server ?

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 anlegen
--- Code: ---defmod myEcovacsServer MQTT2_SERVER 8883 global
attr myEcovacsServer autocreate simple
attr myEcovacsServer room Saugroboter
--- Ende Code ---

Änderung des IODev beim MQTT2-device(sicherheitshalber das nicht mehr benötigte MQTT2-client-device löschen)

--- Code: ---attr Ozmo950 IODev myEcovacsServer
--- Ende Code ---
Bot aus, kurz warten u. wieder ein.

Ich vermute es passiert .....nichts.

Daher die TLS-Verschlüsselung beim Server aktivieren.


--- Code: ---attr myEcovacsServer SSL 1
attr myEcovacsServer sslVersion TLSv12
--- Ende Code ---
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.

--- Code: ---move:backward,forward,SpinLeft,SpinRight,TurnAround,stop iot/p2p/Move/helperbot/bumper/helperbot/$DEVICETOPIC/q/1119/x <ctl td="Move"><move action="$EVTPART1"/></ctl>
--- Ende Code ---

Have fun
Markus

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln