Edit:
Ich habe über die Anbindung der Roomba-Roboter einen Wiki-Eintrag geschrieben, das Hilfsmodul 99_RoombaUtils.pm befindet sich ab sofort im FHEM-Ordner contrib/Roomba.
https://wiki.fhem.de/wiki/Roomba
Es gibt in diesem Wiki-Eintrag auch eine noch etwas rudimentäre Beschreibung, wie man die interaktiven Reinigungskarten erzeugt und verwaltet. Die Roomba-Staubsaugerroboter von iRobot haben einen eingebauten MQTT Server. Das von Thorsten Pferdekämper und anderen entwickelte Modul 42_Roomba980 basiert auf dem Perl-Modul Net::MQTT::Message, funktioniert inzwischen aber nicht mehr. Nach einem Firmware-Update der Staubsauger sagen diese
Zitat2020.09.10 16:33:40 5: MQTT RoombaSauger message received: [2] ConnAck/at-most-once Connection Refused: unacceptable protocol version
2020.09.10 16:33:40 1: 192.168.0.41:8883 disconnected, waiting to reappear (RoombaSauger)
2020.09.10 16:33:41 5: MQTT RoombaSauger message sent: Connect/at-most-once MQTT/5/NetMQTTpm16474
2020.09.10 16:33:41 5: SW: 101a00044d5154540502003c000e4e65744d515454706d3136343734
2020.09.10 16:33:41 5: MQTT RoombaSauger message sent: PingReq/at-most-once
2020.09.10 16:33:41 5: SW: c000
Das Modul wird auch nicht mehr weiterentwickelt.
Ich blicke nicht so ganz durch, wie ich einen MQTT2_SERVER dazu kriegen kann, sich mit einem bisher unbekannten MQTT-Device zu verbinden. Im dem obengenannten Modul geht das mit einem Aufruf aus Net::MQTT::Message
return send_message($hash, message_type => MQTT_CONNECT, keep_alive_timer => $hash->{timeout},
user_name => $user, password => $pass, client_id => $user,
protocol_name => "MQTT", protocol_version => 4);
und produziert den obigen Fehler. Könnte mir mal jemand von den MQTT-Experten auf die Sprünge helfen?
LG
pah
Hmm, bin zwar bei weitem kein Experte, was die Kommunikation "hinter" dem MQTT2_SERVER angeht, aber so wie ich dieses Code-Fragment verstehe, geht es eigentlich eher darum, dass man sich mit dem Broker verbindet und dazu ggf. die Credentials benötigt. Der liefert dann aus oder eben nicht, die Kommunikation in Richtung Client/Sauger ist dann ein 2. Ding.
Hier kommt mir die "4" seltsam vor, ich meine, dass entweder "3" gebräuchlich ist oder dann gleich "5" (was aber bisher noch kein Device genutzt hat, das hier aufgeschlagen war, und M2Server kann (bisher) auch nur MQTT-Protokoll bis V. 3.irgendwas).
Für MQTT2_DEVICE braucht man eigentlich keine Credentials, wenn, dann wäre das ein Thema, das im Rahmen von allowed iVm. dem M2Server zu verorten wäre. Ohne allowed akzeptiert ein "global"-Server auch Nachrichten von Clients, die meinen, es müßte eine Authentifizierung stattfinden. Näheres sollten eigentlich die Logs vom Server liefern.
Ansonsten ist es bei anderen Geräten iVm. M2Server easy: Du trägst die IP/Port-Kombi auf dem Server ein, den (empfangsseitigen) Rest erledigt autocreate. Ist das dein erster Versuch mit einem MQTT-Gerät und M2Server? (Wenn ja: nimm' mal einen Shelly zum Kennenlernen ;) ).
ZitatIst das dein erster Versuch mit einem MQTT-Gerät und M2Server?
Natürlich nicht, ich betreibe schon diverse Dinge damit. Ich diskutiere gerade mit Entwicklern von iRobot, wie man vorgehen kann und werde Euch auf dem Laufenden halten.
So wie ich das jetzt einschätze, stellt der Roomba tatsächlich einen MQTT Broker bereit, und nicht nur das Endgerät. Das würde bedeuten, dass ich mich als Client mit der Kiste verbinden muss.
LG
pah
Hmm, dann implementiert das fragliche Modul also sowohl den Client (alt: 00_MQTT.pm) wie das eigentliche MQTT-Device.
K.A., wie MQTT2_CLIENT das Protokoll aushandelt, aber wenn bis 3.irgendwas ausreicht, könnte es gehen, erst mal nur die Readings abzuholen mit MQTT2_CLIENT (+ aktiviertem autocreate simple) und den passenden Credentials (ich meine, es gab auch schon mal ein ähnliches Projekt, das Stichwort düfte "bumper" sein). Spannender wird dann die Frage, wie die Topics sind, auf denen das Teil seine Befehle erwartet (und in welchem Format).
Ansonsten wäre zu checken, ob das alte Modul wieder mit einer passenden Protokol-Version reanimiert werden könnte. (Insgesamt glaube ich aber, dass eine Verteilung dieser Angelegenheit auf ein IO+Client-Gespann mit den MQTT2-Modulen vermutlich auf die Dauer einfacher zu pflegen sein wird als dieses Einheits-Modul).
Also, mit dem "Einheitsmodul" geht gar nichts mehr, egal, was bei der Protokollversion drinsteht.
Mit MQTT2_CLIENT bin ich einen Schritt weiter - ich erziele immerhin ein "opened" beim MQTT-Broker des Staubsaugers. Jetzt brauche ich nur noch etwas, das ich publishen kann. Gibt es irgendwo ein Beispiel für eine mit MQTT2_CLIENT zu publizierende Message? BLID und Passwort habe ich.
Meine vermutung, dass da ein Broker mit eingebaut ist, hat sich jedenfalls bestätigt. Hier gibt es nämlich ein GitHub-Projekt, das darauf aufbauend den MQTT-Broker des Staubsaugers mit einem anderen MQTT-Broker (also sprich in FHEM) koppelt.
https://github.com/NickWaterton/Roomba980-Python
Leider habe ich das Python-Skript noch nicht richtig zum Laufen bekommen. Aber ich arbeite immerhin dran.
LG
pah
Hmmm, vorher würde ich mal versuchen, an Readings zu kommen => autocreate am IO aktiv?
Falls der Sauger einen Homeassistant-Modus kennt: darüber könnte man uU. rausbekommen, welche messages wo erwartet werden ;) .
Schon wieder einen Schritt weiter. Ich habe jetzt eine Python-Anwendung, die die beiden Broker koppelt. Auch das globale autocreate und das autorcreate im MQTT2_SERVER sind aktiv, verbose 5 zeig tmir auch Daten des Roboters, aber readings werden noch keine angelegt.
Zitat2020.09.12 14:22:32 5: in: PUBLISH: 0!(0)(28)/roomba/feedback/signal_rssi-40
2020.09.12 14:22:32 4: MQTTBridge_127.0.0.1_41349 PUBLISH /roomba/feedback/signal_rssi:-40
2020.09.12 14:22:32 5: MQTTBridge: dispatch autocreate=complex\000\000/roomba/feedback/signal_rssi\000-40
2020.09.12 14:22:32 5: in: PUBLISH: 0(31)(0)(27)/roomba/feedback/signal_snr49
2020.09.12 14:22:32 4: MQTTBridge_127.0.0.1_41349 PUBLISH /roomba/feedback/signal_snr:49
2020.09.12 14:22:32 5: MQTTBridge: dispatch autocreate=complex\000\000/roomba/feedback/signal_snr\00049
2020.09.12 14:22:32 5: in: PUBLISH: 0 (0)(22)/roomba/feedback/stateCharging
2020.09.12 14:22:32 4: MQTTBridge_127.0.0.1_41349 PUBLISH /roomba/feedback/state:Charging
2020.09.12 14:22:32 5: MQTTBridge: dispatch autocreate=complex\000\000/roomba/feedback/state\000Charging
LG
pah
OK, diese Methode klappt schon mal.
Mit der Python-Anwendung im Hintergrund kann ich den Roomba jetzt prima steuern. Aus irgendeinem Grund wurden aber weder das zugehörige MQTT2_DEVICE, noch dessen Readings automatisch angelegt, habe ich alles manuell machen müssen.
Außerdem ist ein Problem mit dem paho-mqttt-Client in Python aufgetreten: Von den Kommandostrings musste ich immer noch ein führendes "b" sowie die "'" entfernen.
Das ist mir jetzt aber noch zu umständlich - es müsste auch mit einem MQTT2_CLIENT direkt auf den Roomba gehen.
LG
pah
Hallo pah,
ich habe mal mit Hilfe von ein paar Beiträgen einen Cloud Broker an MQTT2_CLIENT gekoppelt.
Durch Dein python Script solltest Du alle Infos haben, vielleicht hilft dieses Beispiel (https://heinz-otto.blogspot.com/2020/06/worx-landroid-per-mqtt.html).
autocreate complex ist übrigens nicht unbedingt das Mittel der Wahl, Standard sollte simple sein.
Gruß Otto
Danke Dir.
Ich habe jetzt als Übergangslösung das mit den externen Python-Programmen gemacht. Bisher habe ich es nicht hinbekommen, dass beide Roombas in demselben Python-Programm verwaltet werden.
Lässt man aber 2 davon im Hintergrund laufen, funktioniert das astrein, für jeden Roboter gibt es auf FHEM-Seite ein MQTT2_DEVICE, mit dem ich ihn steuern kann.
Diese Lösung, also MQTT2_DEVICE <-> MQTT2_SERVER <-> Python-Programm <-> Roomba-MQTT-Server <-> Roomba-Gerät habe ich unten beschrieben.
Die andere Lösung wäre MQTT2_DEVICE <-> MQTT2_CLIENT <-> Roomba-MQTT-Server <-> Roomba-Gerät, diese habe ich noch nicht hinbekommen. Denn inzwischen kriege ich - erstaunlicherweise, das hatte zwischendrin ja schon geklappt - eine Verweigerung der Verbindung eines MQTT2_CLIENT mit einem der Roboter. Irgendetwas stimmt dabei an den Credentials nicht, ich muss wohl wirklich nach dem Zertifikat graben, das mit der anderen Methode irgendwie geholt wird (auch da gibt es zunächst beom Connect eine Fehlermeldung, bis TLS 1.3 eingeschaltet wird).
Also, was geht bisher:
1. Auf dem FHEM-Server per
pip install paho-mqtt
pip install pillow
pip install six
pip install git+https://github.com/NickWaterton/Roomba980-Python.git
eine lokale Installation geholt.
2. Mit dem Kommando
python3 ~/Roomba980-Python/roomba/getpasswd.py
die jeweiligen Credentials meiner beiden Roomba geholt. Ergibt jeweils etwas wie
ZitatReceived: {
"robotname": "Feger",
"sku": "R981040",
"nc": 0,
"ver": "3",
"proto": "mqtt",
"ip": "192.168.0.xx",
"hostname": "Roomba-31xxxxxxxxxx0",
"sw": "v2.4.8-44",
"mac": "70:66:xxxxxxxxxxx:6F",
"cap": {
"carpetBoost": 1,
"pp": 1,
"langOta": 1,
"binFullDetect": 1,
"ota": 2,
"maps": 1,
"pose": 1,
"eco": 1,
"multiPass": 2,
"edge": 1,
"svcConf": 1
}
}
Roomba (Feger) IP address is: 192.168.0.XX
blid is: 3###########0
Password=> :######################A <= Yes, all this string.
Use these credentials in roomba.py
3. Ein Python-Programm gebaut, z.B. ~/Roomba980-Python/roomba/fhemfeger.py als
from __future__ import print_function
from roomba import Roomba
import paho.mqtt.client as mqtt
import time
import json
broker = 'localhost' #ip of FHEM mqtt broker
user = ''
password = ''
#roombaName = 'roombaFeger'
#address = '192.168.0.xx'
#blid = '3xxxxxxxxxxxx0'
#roombaPassword = ':1:1xxxxxxxxxxxxxbh'
def broker_on_connect(client, userdata, flags, rc):
print("Broker Connected with result code "+str(rc))
#subscribe to roomba feedback
if rc == 0:
mqttc.subscribe(brokerCommand)
mqttc.subscribe(brokerSetting)
def broker_on_message(mosq, obj, msg):
if roombaName in msg.topic:
#publish to roomba
if "command" in msg.topic:
pl = str(msg.payload).strip('b\'')
print("Received COMMAND: %s" % pl)
myroomba.send_command( pl )
elif "setting" in msg.topic:
print("Received SETTING: %s" % str(msg.payload))
cmd = str(msg.payload).split()
myroomba.set_preference(cmd[0], cmd[1])
def broker_on_publish(mosq, obj, mid):
pass
def broker_on_subscribe(mosq, obj, mid, granted_qos):
print("Broker Subscribed: %s %s" % (str(mid), str(granted_qos)))
def broker_on_disconnect(mosq, obj, rc):
print("Broker disconnected")
def broker_on_log(mosq, obj, level, string):
print(string)
mqttc = None
if broker is not None:
brokerCommand = "/roomba/command/" + roombaName
brokerSetting = "/roomba/setting/" + roombaName
brokerFeedback = "/roomba/feedback/" + roombaName
#connect to broker
mqttc = mqtt.Client()
#Assign event callbacks
mqttc.on_message = broker_on_message
mqttc.on_connect = broker_on_connect
mqttc.on_disconnect = broker_on_disconnect
mqttc.on_publish = broker_on_publish
mqttc.on_subscribe = broker_on_subscribe
try:
mqttc.username_pw_set(user, password) #put your own mqtt user and password here if you are using them, otherwise comment out
mqttc.connect(broker, 1883, 60) #Ping MQTT broker every 60 seconds if no data is published from this script.
except Exception as e:
print("Unable to connect to MQTT Broker: %s" % e)
mqttc = None
myroomba = Roomba(address, blid, roombaPassword, topic="#", continuous=True, clean=False, cert_name = "./ca-certificates.crt")
#all these are optional, if you don't include them, the defaults will work just fine
#if you are using maps
myroomba.enable_map(enable=True, mapSize="(800,1650,-300,-50,2,0)", mapPath="./", iconPath="./") #enable live maps, class default is no maps
if broker is not None:
myroomba.set_mqtt_client(mqttc, brokerFeedback)
#finally connect to Roomba - (required!)
myroomba.connect()
print("<CTRL C> to exit")
print("Subscribe to /roomba/feedback/" + roombaName + "/# to see published data")
try:
if mqttc is not None:
mqttc.loop_forever()
else:
while True:
print("Roomba " + roombaName +" Data: %s" % json.dumps(myroomba.master_state, indent=2))
time.sleep(5)
except (KeyboardInterrupt, SystemExit):
print("System exit Received - Exiting program")
myroomba.disconnect()
if mqttc is not None:
mqttc.disconnect()
4. Dieses Programm läuft auf dem FHEM-Server im Hintergrund als
python3 ~/Roomba980-Python/roomba/fhemfeger.py > /dev/null 2> /dev/null
und schickt alle Messages von dem Roomba-MQTT-Server an den FHEM-MQTT-Server (mit Namen MQTTBridge). Der wiederum kennt für jeden der beiden Roomba ein Device.
5.Listing des einen Devices:
DEVICETOPIC RoombaFeger
FUUID 5f5cbe27-f33f-a726-8734-ab96da6c3ee99444
IODev MQTTBridge
IODevName RoombaFegerClient
LASTInputDev MQTTBridge
MQTTBridge_MSGCNT 2517
MQTTBridge_TIME 2020-09-13 12:44:52
MSGCNT 2517
NAME RoombaFeger
NR 180
STATE Charging
TYPE MQTT2_DEVICE
READINGS:
2020-09-13 12:43:19 audio_active False
2020-09-13 12:43:19 battery 100
2020-09-13 12:43:19 carpetBoost False
2020-09-12 15:46:56 lastCommand dock
2020-09-13 12:43:20 lastInitiator manual
2020-09-13 12:43:19 netinfo_dhcp True
2020-09-13 12:43:19 position_theta 173
2020-09-13 12:43:19 position_x -12
2020-09-13 12:43:19 position_y 29
2020-09-13 12:44:52 signal_rssi -41
2020-09-13 12:44:52 signal_snr 48
2020-09-13 12:44:52 state Charging
Attributes:
IODev MQTTBridge
autocreate 1
readingList /roomba/feedback/roombaFeger/state:.* state
/roomba/feedback/roombaFeger/signal_rssi:.* signal_rssi
/roomba/feedback/roombaFeger/signal_snr:.* signal_snr
/roomba/feedback/roombaFeger/netinfo_dhcp:.* netinfo_dhcp
/roomba/feedback/roombaFeger/audio_active:.* audio_active
/roomba/feedback/roombaFeger/batPct:.* battery
/roomba/feedback/roombaFeger/carpetBoost:.* carpetBoost
/roomba/feedback/roombaFegerr/astCommand_command:.* lastCommand
/roomba/feedback/roombaFeger/lastCommand_initiator:.* lastInitiator
/roomba/feedback/roombaFeger/pose_theta:.* position_theta
/roomba/feedback/roombaFeger/pose_point_x:.* position_x
/roomba/feedback/roombaFeger/pose_point_y:.* position_y
setList start /roomba/command/roombaFeger start
stop /roomba/command/roombaFeger stop
pause /roomba/command/roombaFeger pause
resume /roomba/command/roombaFeger resume
dock /roomba/command/roombaFeger dock
6. Ich habe es bisher nicht hinbekommen, die beiden unterschiedlichen Roombas in einem einzelnen Python-Programm abzudecken. Also werden ganz einfach zwei davon gestartet, es gibt zwei bach-Skripte in /opt/fhem, eins zum checken
#!/bin/bash
statsauger=`ps -ef | grep fhemsauger | grep -v grep | awk '{print $2}'`
statfeger=`ps -ef | grep fhemfeger | grep -v grep | awk '{print $2}'`
if [ "$statsauger" == "" ] || [ "$statfeger" == "" ]; then
echo -n "0"
else
echo -n "1"
fi
und eins zum Starten der beiden Python-Programme
#!/bin/bash
statsauger=`ps -ef | grep fhemsauger | grep -v grep | awk '{print $2}'`
statfeger=`ps -ef | grep fhemfeger | grep -v grep | awk '{print $2}'`
if [ "$statsauger" == "" ]; then
python3 /root/Roomba980-Python/roomba/fhemsauger.py > /dev/null 2> /dev/null &
fi
if [ "$statfeger" == "" ]; then
python3 /root/Roomba980-Python/roomba/fhemfeger.py > /dev/null 2> /dev/null &
fi
7. Auf FHEM-Seite werden diese überwacht durch einen Dummy
Internals:
CFGFN
FUUID 5f5df29c-f33f-a726-2e25-be3150af0bbdd339
NAME RoombaBridge
NR 1291
STATE on
TYPE dummy
READINGS:
2020-09-13 12:49:01 state on
Attributes:
devStateIcon off:ios-off .*:ios-on-green
setList start stop on off
webCmd start:stop
ein at zum periodischen checken
Internals:
CFGFN
COMMAND {fhem("set RoombaBridge ".((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))}
DEF +*00:05:00 {fhem("set RoombaBridge ".((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))}
FUUID 5f5df319-f33f-a726-6529-6a2067913cf0b841
NAME RoombaChecker
NR 1323
NTM 12:54:01
PERIODIC yes
RELATIVE yes
REP -1
STATE Next: 12:54:01
TIMESPEC 00:05:00
TRIGGERTIME 1599994441.07101
TRIGGERTIME_FMT 2020-09-13 12:54:01
TYPE at
READINGS:
2020-09-13 12:49:01 state Next: 12:54:01
Attributes:
und ein IF zum Abfangen der start/stop-Befehle für die Python-Skripte
Internals:
CFGFN
DEF ([RoombaBridge] eq "start")
({system ("sudo /opt/fhem/startRoomba.sh")},
{fhem("set RoombaBridge ".
((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))})
DOELSEIF ([RoombaBridge] eq "stop")
({system ("sudo /opt/fhem/stopRoomba.sh")},
{fhem("set RoombaBridge ".
((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))})
FUUID 5f5df3a0-f33f-a726-7120-1bf01544cde3ae26
MODEL FHEM
NAME Roomba.IF
NOTIFYDEV RoombaBridge,global
NR 1359
NTFY_ORDER 50-Roomba.IF
STATE initialized
TYPE DOIF
VERSION 22757 2020-09-11 16:21:17
READINGS:
2020-09-13 12:49:01 Device RoombaBridge
2020-09-13 12:27:47 cmd 0
2020-09-13 12:49:01 e_RoombaBridge_STATE on
2020-09-13 12:27:47 mode enabled
2020-09-13 12:27:47 state initialized
Regex:
accu:
cond:
RoombaBridge:
0:
&STATE ^RoombaBridge$
1:
&STATE ^RoombaBridge$
condition:
0 ::InternalDoIf($hash,'RoombaBridge','STATE') eq "start"
1 ::InternalDoIf($hash,'RoombaBridge','STATE') eq "stop"
do:
0:
0 {system ("sudo /opt/fhem/startRoomba.sh")}, {fhem("set RoombaBridge ". ((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))}
1:
0 {system ("sudo /opt/fhem/stopRoomba.sh")}, {fhem("set RoombaBridge ". ((`/opt/fhem/checkRoomba.sh` eq "1")?"on":"off"))}
2:
helper:
DEVFILTER ^global$|^RoombaBridge$
NOTIFYDEV global|RoombaBridge
event on
globalinit 1
last_timer 0
sleeptimer -1
triggerDev RoombaBridge
triggerEvents:
on
triggerEventsState:
state: on
internals:
all RoombaBridge:STATE
readings:
trigger:
uiTable:
Attributes:
do always
LG
pah
OK, Auslesen klappt auch ohne zusätzliche Python-Programme.
Der Weg ist also jetzt:
MQTT2_DEVICE <-> MQTT2_CLIENT <-> Roomba-MQTT-Server <-> Roomba-Gerät
Nötig dafür war im Client sowohl den username als auch die clientId auf die BLID aus dem Roboter zu setzen, sowie bei sslargs SSL_version:SSLv23 einzusetzen.
Ergebnis ist - bei verbose 5 - eine ganze Menge von Messages, hier ein paar Auszüge
Zitat2020.09.13 15:27:01 5: RoombaSaugerClient: received PUBLISH (0)*$aws/things/3xx90/shadow/update{"state":{"reported":{"batPct":84,"dock":{"known":false},"bin":{"present":true,"full":false},"audio":{"active":false}}}}
2020.09.13 15:27:01 5: RoombaSaugerClient: dispatch autocreate=simple\0003xx90\000$aws/things/3xx90/shadow/update\000{"state":{"reported":{"batPct":84,"dock":{"known":false},"bin":{"present":true,"full":false},"audio":{"active":false}}}}
2020.09.13 15:27:01 5: RoombaSaugerClient: received PUBLISH (0)*$aws/things/3xx90/shadow/update{"state":{"reported":{"cleanMissionStatus":{"cycle":"none","phase":"charge","expireM":0,"rechrgM":0,"error":0,"notReady":0,"mssnM":0,"sqft":0,"initiator":"rmtApp","nMssn":68},"language":4,"noAutoPasses":true,"noPP":false,"ecoCharge":false}}}
2
die auch mit autocreate wunderbar in die entsprechenden Readings umgewandelt werden. Sowohl die MQTT2_Devices, als auch die Readings werden sauber angelegt, dabei ist z.B. die readingList dann aber manuell angepasst auf
Zitat3xx90:wifistat:.* { json2nameValue($EVENT) }
3xx90:.*aws/things/3xx90/shadow/update:.* { json2nameValue($EVENT) }
Passt also. Jetzt fehlt mir nur noch ein schlauer Einfall für die setList.
Probiert habe ich ohne Erfolg schon das Publizieren von
/things/3xx90/command start
*$aws/things/3xx90/command start
*$aws/things/3xx90/command start
und ungefähr 100 Variationen davon. Hat irgendjemand von Euch einen Schimmer, wie ich den richtigen Topic dafür finden kann?
LG
pah
Hmm, unterstellt, der Code aus https://github.com/ThorstenPferdekaemper/FHEM-Roomba980/blob/master/FHEM/42_Roomba980.pm#L309 paßt noch, müßte der Command-Topic eigentlich nur "cmd" (also ganz ohne things oä, einfach nur diese drei Buchstaben) sein, oder lese ich "apiCall()" ggf. falsch?
Allerdings ist mir dann nicht klar, welche Messages ggf. dann JSON-encoded sein müssen, aber das ergibt sich (jedenfalls für eine ggf. ältere Version) auch aus diesem apiCall(), oder? (Das ist aber etwas für mich schwierig zu raten, ich habe keinen wirlliche Idee, was die ganzen Kommandos sollen...)
Gibt's denn nirgends eine Beschreibung der MQTT-API?
(Oder gibt es ggf. eine Option für "Homeassistant"? Das wäre ggf. hilfreich, weil da dann u.a. auch drinstehen sollte, was das Ding an Befehlen unter welchem Topic entgegennimmt).
Bisher alles (auch "cmd") ohne erfolg ausprobiert.
LG
pah
Hallo,
Wollte mal das mit folgendem MQTT2 Client nachstellen:
defmod myRoombaClient MQTT2_CLIENT 192.168.178.62:1883
attr myRoombaClient SSL 1
attr myRoombaClient autocreate simple
attr myRoombaClient clientId 123456789
attr myRoombaClient mqttVersion 3.1.1
attr myRoombaClient room Roomba
attr myRoombaClient sslargs SSL_version:SSLv23
attr myRoombaClient username 123456789
attr myRoombaClient verbose 5
setstate myRoombaClient disconnected
setstate myRoombaClient 2020-09-14 12:30:48 state disconnected
Allerdings ist der immer disconnected.
username und clientId ist auf die BLID gesetzt.
password ist natürlich auch gesetzt.
im log sehe ich nur:
2020.09.14 12:34:10 5: HttpUtils url=https://192.168.178.62:1883/
2020.09.14 12:34:10 4: IP: 192.168.178.62 -> 192.168.178.62
2020.09.14 12:34:10 4: HttpUtils: 192.168.178.62: Verbindungsaufbau abgelehnt (111)
Was fehlt hier noch?
Gruß Carlos
Hallo Carlos,
ich hätte anstatt 1883 - 8883 vermutet?
Gruß Otto
Habe ich schon probiert, geht auch nicht nicht.
Im übrigen gehen als HTTPMod und JsonMod (nur status) angelegte devices hervorragend.
@carlos:
Die anonymisierte ClientID ist hoffentlich eine andere als die, die der Sauger intern verwendet? Sonst verwirft der "on-Board-Broker" vermutlich den Verbindungsversuch auch deswegen... (Es kann nur jeweils einen Client/Broker mit derselben ClientID geben, daher die häufiger anzutreffenden "random"-ClientID's).
und irgendwo hatte ich gelesen, dass der oBB ;) sowieso nur eine gleichzeitige Verbindung akzeptiert!? Aber ich rede nur theoretisch ...
@pah wg. der setList:
Magst du mal ein RAW (bzw. die readingList) von dem aktuellen MQTT2_DEVICE liefern? Die Zusammensetzung des cmd-Pfads scheint uU. auch den Namen zu beinhalten, zumindest sieht mir die Funktion ab hier so aus: https://github.com/NickWaterton/Roomba980-Python/blob/76d7f512891b49f8e2ba79e6e90e5886e6c47ce4/build/lib.linux-x86_64-2.7/roomba/roomba.py#L401 (https://github.com/NickWaterton/Roomba980-Python/blob/76d7f512891b49f8e2ba79e6e90e5886e6c47ce4/build/lib.linux-x86_64-2.7/roomba/roomba.py#L401) Das Script scheint irgendeine Art Indirektion vorzunehmen...
@Otto:
Das würde dann bedeuten, dass man entweder das script nehmen kann oder MQTT2_CLIENT, oder?
Aber PAH schreibt doch:
ZitatNötig dafür war im Client sowohl den username als auch die clientId auf die BLID aus dem Roboter zu setzen, sowie bei sslargs SSL_version:SSLv23 einzusetzen.
deswegen habe ich beides auf die BLID gesetzt.
@Otto123 Habe ich auch gelesen, aber meine beiden (HTTPMod und JsonMod) funktionieren gleichzeitig.
Hatte ich hier gelesen: https://intranet-der-dinge.de/smarthome/haus/roomba/
Wie immer das wirklich gemeint ist? Ich wollte es nur in die Runde werfen, ich kann es nicht prüfen.
Hmm,
ich kann da nur die Theorie ausführen. Kann schon sein, dass die ClientID "freigehalten" wird und intern eine andere genutzt wird für "firmware<->Broker". Als zusätzliches Begrenzungsmittel das Zugriffst wäre das logisch, als Ursache für Verbindungsabbrüche, falls da was intern schief läuft auch (kann sein, dass mosquitto/paho da früher nicht so empfindlich war und das (mit) die Ursache dafür ist, dass das Modul nicht mehr geht)...
Betr. jsonMod+HTTPMOD: Machen die nicht eine Verbindung auf, holen die Daten und machen die Verbindung dann wieder zu? Nacheinander sollte es dann auch "miteinander" gehen...
Zitatwieder zu? Nacheinander sollte es dann auch "miteinander" gehen...
So isses.
Die readingList wurde durch das autocreate angelegt, ich habe nur etwas manuell optimiert:
31xx80:.* { json2nameValue($EVENT) }
31xx80:wifistat:.* { json2nameValue($EVENT) }
31xx80:.*aws/things/31xx80/shadow/update:.* { json2nameValue($EVENT) }
(31xx80 ist die natürlich längere BLID). Ich habe wirklich systematisch rund 50 Kombinationen aus BLID, Name (das Teil heißt "Feger"), "cmd", "command" etc. für die setList durchprobiert
ZitatGibt's denn nirgends eine Beschreibung der MQTT-API?
Keine, die ich gefunden hätte.
LG
pah
(Da ist noch eine vollst. BID drin)
Ansonsten habe ich auch keine wirkliche Idee, was der cmd-Pfad anderes als der "cmd" sein sollte; ein sich dynamisch ändernder cmd-Topic macht ja keinen Sinn... Vermutlich ist die Payload irgendwie JSON-verpackt, aber das ist ohne API-Beschreibung auch ziemliche Kaffeesatzleserei aus den diversen Implementierungen. Unschön...
In dem Ding von Waterton lese ich
Command = OrderedDict()
Command["command"] = command
Command["time"] = self.totimestamp(datetime.datetime.now())
Command["initiator"] = "localApp"
myCommand = json.dumps(Command)
self.log.info("Publishing Roomba Command : %s" % myCommand)
self.client.publish("cmd", myCommand)
Das wäre also als json so etwas wie
{"command":"start","time":timestamp,"initiator":"localApp"}
Und tada ! So isses.
Mit einer setList
start cmd {"command": "start", "time": 1, "initiator": "localApp"}
stop cmd {"command": "stop", "time": 1, "initiator": "localApp"}
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"}
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"}
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
kann die Kiste via MQTT gesteuert werden. Man benötigt also nicht einmal einen tatsächlichen Timestamp, die Zahl 1 genügt ...
LG
pah
Zitat von: Prof. Dr. Peter Henning am 14 September 2020, 15:38:23
Mit einer setList
start cmd {"command": "start", "time": 1, "initiator": "localApp"}
stop cmd {"command": "stop", "time": 1, "initiator": "localApp"}
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"}
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"}
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
kann die Kiste via MQTT gesteuert werden. Man benötigt also nicht einmal einen tatsächlichen Timestamp, die Zahl 1 genügt ...
Cool!
(Die BLID steht in der readingList oben immer noch absichtlich in voller Pracht?)
(Unter attrTemplate-Gesichtspunkten: Der nächste Schritt wäre jetzt, erst mal die setList ggf. zu optimieren oder zu erweitern (ggf. auch eine getList für Status-Abfragen zu erstellen, und dann nochmal kritisch zu checken, welche Infos eigentlich über welchen Topic kommen und ob sich das irgendwie besser sortieren läßt; "wifistat" scheint sowas wie LWT zu sein?
Bei Interesse müsste ich etwas mehr Infos haben, sonst gehe ich mal davon aus, dass du auch alleine klarkommst, ist ja kein Hexenwerk :) ).
Geht schon, bin ja nicht direkt ein Anfänger 8).
Setzen von Einstellungen geht auch, z.B. mit
carpetBoost delta {"state": {"carpetBoost": true}}
LG
pah
@carlos: im Roboter darf nicht ecoCharge=true gesetzt werden, das verhindert die Verbindung mit dem MQTT2_CLIENT
LG
pah
Bei mir ist ecoCharge=0
Interessanerweise bekomme ich jetzt folgenden Fehler:
2020.09.14 18:09:02 5: HttpUtils url=https://192.168.178.62:8883/
2020.09.14 18:09:02 4: IP: 192.168.178.62 -> 192.168.178.62
2020.09.14 18:09:04 4: HttpUtils: https://192.168.178.62:8883/: Can't connect(2) to https://192.168.178.62:8883: SSL connect attempt failed error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
Könntest du bitte mal ein LIST on deinem Client hier reinstellen zum Vergleich.
Danke und Gruß
Carlos
OK, tut alles fast wie gewünscht.
Woran ich noch knobele:
- Manche RegExps scheinen für den Parser bei readingList etwas zu kompliziert zu sein
- Das jsonMap Attribut ist viel zu umständlich. Hier müsste es die Möglichkeit geben, per Wildcard einfach eine ganze Gruppe von Readings auszuschließen.
- Mir fehlt noch eine Möglichkeit, bei "set <Device> CarpetBoost true" den Parameter true in das generierte JSON mit aufzunehmen. Zwar soll laut CommandRef die Verwendung von Perl-Ausdrücken in der setList möglich sein. Das ist aber nicht gut dokumentiert und funktioniert auch nicht einfach so. Abgesehen vom zu setzenden Parameterwert (true in diesem Fall) sollte auch statt der nackten "1" bei der Timestamp die richtige Zeit verwendet werden, dafür brauche ich aber einen Perl-Aufruf im Innern des JSON-Ausdrucks. Es gibt natürlich auch den umgekehrten Weg, das ganze JSON aus Perl heraus zu generieren. Mal sehen, heute nicht mehr.
Also, hier zum Ausprobieren die nackten Konfigurationsdaten für einen MQTT2_CLIENT und ein MQTT2_DEVICE
define RoombaFegerClient MQTT2_CLIENT 192.168.x.yy:8883
attr RoombaFegerClient SSL 1
attr RoombaFegerClient autocreate simple
attr RoombaFegerClient clientId 3.................80
attr RoombaFegerClient mqttVersion 3.1.1
attr RoombaFegerClient sslargs SSL_version:SSLv23
attr RoombaFegerClient username 3.................80
attr RoombaFegerClient verbose 1
define RoombaFeger MQTT2_DEVICE 3................80
attr RoombaFeger IODev RoombaFegerClient
attr RoombaFeger jsonMap state_reported_pose_point_x:position_x\
state_reported_pose_point_y:position_y\
state_reported_pose_theta:position_theta\
state_reported_lastCommand_initiator:lastCommandInitiator\
state_reported_lastCommand_command:lastCommand\
state_reported_lastCommand_time:0\
state_reported_localtimeoffset:0\
state_reported_mac:0\
state_reported_netinfo_addr:0\
state_reported_netinfo_bssid:\
state_reported_netinfo_dhcp:0\
state_reported_netinfo_dns1:0\
state_reported_netinfo_dns2:0\
state_reported_netinfo_gw:0\
state_reported_netinfo_mask:0\
state_reported_netinfo_sec:0\
state_reported_signal_rssi:signalRSSI\
state_reported_signal_snr:signalSNR\
state_reported_utctime:0\
state_reported_wifistat_cloud:0\
state_reported_wifistat_uap:0\
state_reported_wifistat_wifi:0\
state_reported_wlcfg_sec:0\
state_reported_wlcfg_ssid:0\
state_reported_cleanMissionStatus_cycle:cmCycle\
state_reported_cleanMissionStatus_error:cmError\
state_reported_cleanMissionStatus_expireM:cmExpireM\
state_reported_cleanMissionStatus_initiator:cmInitiator\
state_reported_cleanMissionStatus_mssnM:cmMMission\
state_reported_cleanMissionStatus_nMssn:cmNMission\
state_reported_cleanMissionStatus_notReady:cmNotReady\
state_reported_cleanMissionStatus_phase:cmPhase\
state_reported_cleanMissionStatus_rechrgM:cmRechargeM\
state_reported_cleanMissionStatus_sqft:cmSqft\
state_reported_binPause:sBinPause\
state_reported_carpetBoost:sCarpetBoost\
state_reported_openOnly:sOpenOnly\
state_reported_schedHold:sSchedHold\
state_reported_twoPass:sTwoPass\
state_reported_vacHigh:sVacHigh\
attr RoombaFeger readingList 3.......................80:wifistat:.* { json2nameValue($EVENT,'',$JSONMAP) }\
3..................80:.*aws/things/3...........................80/shadow/update.*Command.* { json2nameValue($EVENT,'',$JSONMAP) }
attr RoombaFeger room Unsorted
attr RoombaFeger setList start:noArg cmd {"command": "start", "time": 1, "initiator": "localApp"}\
stop:noArg cmd {"command": "stop", "time": 1, "initiator": "localApp"}\
dock:noArg cmd {"command": "dock", "time": 1, "initiator": "localApp"}\
resume:noArg cmd {"command": "resume", "time": 1, "initiator": "localApp"}\
pause:noArg cmd {"command": "pause", "time": 1, "initiator": "localApp"}\
CarpetBoostOn:noArg delta {"state": {"carpetBoost": true}}\
TwoPassOn:noArg delta {"state": {"twoPass": true}}\
VacHighOn:noArg delta {"state": {"vacHigh": true}}\
CarpetBoostOff:noArg delta {"state": {"carpetBoost": false}}\
TwoPassOff:noArg delta {"state": {"twoPass": false}}\
VacHighOff:noArg delta {"state": {"vacHigh": false}}
LG
pah
Hmm, bei der readingList kann man die CID jedenfalls dann rauslassen, wenn man nicht mehrere von den Dingern hat (es sollte wg. des individuellen IOs dann trotzdem klappen, aber es dürfte andere rL geben, wenn das Ding irgendeinen Namen hat?).
Statt die ID irgendwie als regex-Teil zu nehmen, kannst du auch $DEVICETOPIC als Wildcard hernehmen (muß dann entsprechend gesetzt sein).
Wirf mal einen Blick auf den tasmota2zigbee-Teil. Da gibt es Logiken, einen inneren JSON zu erkennen und dann auch nur den auszuwerten; ansonsten gibt es bei json2nameValue() einen 4. Parameter, um Teile rauszufiltern (filter als Schlagwort sollte für j2nv wenige Treffer liefern).
Parameter kann man mit $EVTPART1 etc. übergeben, damit sollte z.B.
boost:true, false cmd {"json_elemente":"$EVTPART1"}
gehen. Auch da gibt es einige Beispiele in der mqtt2.template-file, wenn man nach EVTPART sucht. setList kann auch Perl, es muß am Ende dann einfach ein String mit topic+Payload zurückgeliefert werden, wie du das zusammenbaust, bleibt dir überlassen (schnelles Beispiel: tasmota_rgbw_led). Zur Doku: Du darfst das gerne besser machen, ich suche noch nach einem freiwilligen, der einen Artikel zu den ganzen MQTT2_DEVICE-Attributen bzw. auch den allgemeinen FHEMWEB-Attributen entwirft (anhand eines shelly-pm). Da würde dann Perl-setList zwar erst ganz am Ende kommen, aber wer auch immer den schreibt, kann das ja aufnehmen ;) ... (Ansonsten ist die mqtt2.template ein ziemlich guter Steinbruch für alles mögliche, man muß nur wissen, nach was man sucht...)
Zitatboost:true, false cmd
Ist das richtig mit dem Leerzeichen zwischen dem Komma und false ? das klappt doch nicht oder doch ? Habs nicht ausprobiert...
Wenn doch, Kommentar einfach ignorieren.
edit:
für die mit weniger Erfahrung:
attr widgets setList 00select:1,2,3,4,5,a,b,c,def,hik (https://wiki.fhem.de/wiki/FHEMWEB/Widgets)
Unbeabsichtigt, sorry...
ZitatZur Doku: Du darfst das gerne besser machen, ich suche noch nach einem freiwilligen, der einen Artikel zu den ganzen MQTT2_DEVICE-Attributen bzw. auch den allgemeinen FHEMWEB-Attributen entwirft (anhand eines shelly-pm).
Setze ich gerne auf meine Agenda. Allerdings schreibe ich derzeit an einem neuen Buch, das kann also ein Jahr dauern...
LG
pah
Zitat von: Prof. Dr. Peter Henning am 15 September 2020, 14:14:56
Setze ich gerne auf meine Agenda. Allerdings schreibe ich derzeit an einem neuen Buch, das kann also ein Jahr dauern...
;D
Lass mal, vielleicht finde ich vorher einen anderen Freiwilligen, der das dann auch tatsächlich mal macht....? ("Jüngst" kam das mit dem eocr&Co wieder ganz neu in den Fokus :'( .)
So, ich habe eine arbeitsfähige Version der ganzen Angelegenheit.
Unschön ist noch die gigantische Menge an Readings - von denen man dann die meisten wieder mit der jsonMap eliminieren muss. Mir schwebt derzeit vor, stattdessen ein paar Hilfsfunktionen zu definieren, die an Stelle von json2nameValue aufgerufen werden können und aus dem strukturierten JSON-Zeug wenige aussagekräftige Readings machen.
LG
pah
Geht es denn nicht mit dem optionalen 4. Parameter von json2nameValue diese weniger aussagekräftigen Readings gleich zu erhalten ?
Halte ich für zielführend mit den Hilfsfunktionen, falls das mit "filter" in json2nameValue() nicht passt (?). (In der Hinsicht war TomLee schneller :) )
Es gibt eine funktionierende Konstruktion für ebus und den anderen Sauger, die man übertragen könnte: da wird myUtils-Code vom attrTemplate dann aus dem contrib-svn nachgeladen. Die "extended version" gäbe es in zwave.template: der zugehörige myUtils-Code ist dort auch noch als package ausgeformt...
Hallo!
Find ich super, wenn man den Roboter wieder steuern kann.
Hab es gleich mit dem Roomba e5 probiert, damit funktioniert es auch.
Allerdings dürfte etwas noch nicht ganz stimmen, den so lange MQTT aktiv ist, leuchten am Roboter alle weißen LED (CLEAN, WLAN, Home) auf dauer.
Normal gehen die nach kurzer Zeit aus.
Ist das bei den anderen Typen auch so?
@Beta-User: filter wird es nicht tun. Wenn ich z.B. aus dem länglichen JSON-Ausdruck die Datenwerte für state_reported_cleanSchedule_H_7=9 und state_reported_cleanSchedule_m_7=0 nicht möchte, sondern daraus den Zeitpunkt 9:00 (Samstags) konstruieren will, komme ich um etwas Perl-code nicht herum.
@GerhardSt: Ich habe das jetzt mit einem 960 und einem 981 ausprobiert, zu anderen Typen kann ich nichts sagen. Aktuelle Version von readingList und setList anbei (DEVICETOPIC ist auf die BLID gesetzt). Finde ich aber prima, bei so vielen unterschiedlichen Typen kann man nur gemeinsam etwas erreichen. Es ist ganz instruktiv, sich dafür mit verbose=5 im MQTT2_CLIENT die rohen Events anzuschauen.
Bei mir sehe ich auch nichts von dauerhaft leuchtenden LEDs. Allerdings verliert, wenn ich "ecoCharge" true setze, der Roboter seine Verbindung und kann per MQTT offenbar auch nicht mehr aufgeweckt werden. Wenn ich etwas mehr Zeit habe, werde ich mal ausprobieren, ob ein Wake-On-Lan-Paket das Teil wieder aufweckt.
LG
pah
readingList:
$DEVICETOPIC:wifistat:.* { json2nameValue($EVENT,'',$JSONMAP) }
$DEVICETOPIC:.*pose.* { json2nameValue($EVENT,'',$JSONMAP) }
$DEVICETOPIC:.*batPct.* { json2nameValue($EVENT,'',$JSONMAP) }
$DEVICETOPIC:.*Command.* { json2nameValue($EVENT,'',$JSONMAP) }
$DEVICETOPIC:.*cleanSchedule.* { json2nameValue($EVENT,'',$JSONMAP) }
setList
start:noArg cmd {"command": "start", "time": 1, "initiator": "localApp"}
stop:noArg cmd {"command": "stop", "time": 1, "initiator": "localApp"}
dock:noArg cmd {"command": "dock", "time": 1, "initiator": "localApp"}
resume:noArg cmd {"command": "resume", "time": 1, "initiator": "localApp"}
pause:noArg cmd {"command": "pause", "time": 1, "initiator": "localApp"}
CarpetBoost:true,false delta {"state": {"carpetBoost": $EVTPART1}}
TwoPass:true,false delta {"state": {"twoPass": $EVTPART1}}
VacHigh:true,false delta {"state": {"vacHigh": $EVTPART1}}
BinPause:true,false delta {"state": {"binPause": $EVTPART1}}
OpenOnly:true,false delta {"state": {"openOnly": $EVTPART1}}
jsonMap ist inzwischen etwas länglich
state_reported_pose_point_x:position_x
state_reported_pose_point_y:position_y
state_reported_pose_theta:position_theta
state_reported_lastCommand_initiator:lastCommandInitiator
state_reported_lastCommand_command:lastCommand
state_reported_lastCommand_time:0
state_reported_localtimeoffset:0
state_reported_mac:0
state_reported_netinfo_addr:0
state_reported_netinfo_bssid:
state_reported_netinfo_dhcp:0
state_reported_netinfo_dns1:0
state_reported_netinfo_dns2:0
state_reported_netinfo_gw:0
state_reported_netinfo_mask:0
state_reported_netinfo_sec:0
state_reported_signal_rssi:signalRSSI
state_reported_signal_snr:signalSNR
state_reported_utctime:0
state_reported_wifistat_cloud:0
state_reported_wifistat_uap:0
state_reported_wifistat_wifi:0
state_reported_wlcfg_sec:0
state_reported_wlcfg_ssid:0
state_reported_cleanMissionStatus_cycle:cmCycle
state_reported_cleanMissionStatus_error:cmError
state_reported_cleanMissionStatus_expireM:cmExpireM
state_reported_cleanMissionStatus_initiator:cmInitiator
state_reported_cleanMissionStatus_mssnM:cmMMission
state_reported_cleanMissionStatus_nMssn:cmNMission
state_reported_cleanMissionStatus_notReady:cmNotReady
state_reported_cleanMissionStatus_phase:cmPhase
state_reported_cleanMissionStatus_rechrgM:cmRechargeM
state_reported_cleanMissionStatus_sqft:cmSqft
state_reported_binPause:sBinPause
state_reported_carpetBoost:sCarpetBoost
state_reported_openOnly:sOpenOnly
state_reported_schedHold:sSchedHold
state_reported_twoPass:sTwoPass
state_reported_vacHigh:sVacHigh
state_reported_audio_active:audioActive
state_reported_batPct:battery
state_reported_bin_full:binFull
state_reported_bin_present:0
state_reported_dock_known:0
state_reported_batteryType:0
state_reported_cap_binFullDetect:0
state_reported_cap_carpetBoost:0
state_reported_cap_eco:0
state_reported_cap_edge:0
state_reported_cap_langOta:0
state_reported_cap_maps:0
state_reported_cap_multiPass:0
state_reported_cap_ota:0
state_reported_cap_pose:0
state_reported_cap_pp:0
state_reported_cap_svcConf:0
state_reported_hardwareRev:0
state_reported_sku:0
state_reported_soundVer:0
state_reported_uiSwVer:0
state_reported_cleanSchedule_cycle_1:tpSunday
state_reported_cleanSchedule_cycle_2:tpMonday
state_reported_cleanSchedule_cycle_3:tpTuesday
state_reported_cleanSchedule_cycle_4:tpWednesday
state_reported_cleanSchedule_cycle_5:tpThursday
state_reported_cleanSchedule_cycle_6:tpFriday
state_reported_cleanSchedule_cycle_7:tpSaturday
state_reported_cleanSchedule_h_1:tpSundayH
state_reported_cleanSchedule_h_2:tpMondayH
state_reported_cleanSchedule_h_3:tpTuesdayH
state_reported_cleanSchedule_h_4:tpWednesdayH
state_reported_cleanSchedule_h_5:tpThursdayH
state_reported_cleanSchedule_h_6:tpFridayH
state_reported_cleanSchedule_h_7:tpSaturdayH
state_reported_cleanSchedule_m_1:tpSundayM
state_reported_cleanSchedule_m_2:tpMondayM
state_reported_cleanSchedule_m_3:tpTuesdayM
state_reported_cleanSchedule_m_4:tpWednesdayM
state_reported_cleanSchedule_m_5:tpThursdayM
state_reported_cleanSchedule_m_6:tpFridayM
state_reported_cleanSchedule_m_7:tpSaturdayM
state_reported_bbchg3_avgMin:0
state_reported_bbchg3_estCap:0
state_reported_bbchg3_hOnDock:0
state_reported_bbchg3_nAvail:0
state_reported_bbchg3_nDocks:0
state_reported_bbchg3_nLithChrg:0
state_reported_bbchg3_nNimhChrg:0
Hallo und erstmal vielen Dank für eure Mühen.
ich hatte schon länger vor meinen Roomba einzubinden.
Auf Wunsch der Regierung ist zufällig vorgestern der 2e 675 angekommen.
Ich habe es nach pah s "nackten Konfigurationsdaten" und jsonMAP / setList / readingList eingebunden.
Ich kann bestätigen:Die Roomba 675/676 funktionieren - auch mit der aktuellsten Firmware.
Gruß und Dank
Andreas
Zitat von: Prof. Dr. Peter Henning am 15 September 2020, 21:14:53
@Beta-User: filter wird es nicht tun. Wenn ich z.B. aus dem länglichen JSON-Ausdruck die Datenwerte für state_reported_cleanSchedule_H_7=9 und state_reported_cleanSchedule_m_7=0 nicht möchte, sondern daraus den Zeitpunkt 9:00 (Samstags) konstruieren will, komme ich um etwas Perl-code nicht herum.
:) einleuchtend...
Daher gab es ja auch gleich die "extended Version":
Zitat von: Beta-User am 15 September 2020, 16:54:57
Die "extended version" gäbe es in zwave.template: der zugehörige myUtils-Code ist dort auch noch als package ausgeformt...
Das mit package würde ich hier (vom Bauchgefühl her) für die "richtige" Vorgehensweise ansehen; das ganze hat dann ja wirklich den "Einschlag" eines eigenständigen Moduls, und evtl. läßt sich ja was vom Code des seitherigen Moduls wiederverwerten?
(Vermutlich werde ich auch den anderen MQTT2-Sauger-Code mal Richtung package umbauen, ist aber low prio).
(Ansonsten finde ich es klasse, dass sich so schnell weitere User für diesen "usecase" eingefunden haben, Danke für's "Anschubsen"!)
Ich habe mich ja bisher immer um attrTemplate herumgedrückt. Allerdings erscheint es mir ab sofort sinnvoll, und ich werde auch das mit dem Package bevorzugen.
Es ist eigentlich auch logisch, dass bei der Vielzahl der vorhandenen Module damit etwas unterhalb der Modulebene enststeht, das mit verteilt werden kann.
Betreffend die Roombas habe ich Folgendes auf der Agenda:
- Bessere Rückmeldungen in FHEM über Zustand und Ablauf der Reinigung
- Erzeugen von Cleaning Maps via FHEM (aus den gemeldeten Positionen)
Wenn ich herausfinde, wie man die Kiste an eine bestimmte Position manövrieren kann, könnte man auch so etwas wie "hier ist es schmutzig, mach mal bitte da sauber" erreichen, ohne die Kiste hochzuheben.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 17 September 2020, 10:00:23
Ich habe mich ja bisher immer um attrTemplate herumgedrückt.
Na ja, das überrascht vielleicht, aber ich war auch erst skeptisch, ob das ganze ein "gutes" Werkzeug ist und noch skeptischer, als ich dann entschieden habe, via attrTemplate die "on/off"-Meldungen auf den Tasmota-firmwares auf Kleinschreibung umzukonfigurieren und damit etwas zu machen, was auch "außerhalb FHEM" Auswirkungen hat.
Grundsätzlich hat sich die ganze Methodik aber m.E. bewährt, vor allem für Sachen, die sehr "offen" in der Konfiguration sind und dem, was sie an Daten und Kommandos liefern, wie eben MQTT2_DEVICE (oder HTTPMOD, aber da lag es mAn. an dem bisherigen Maintainer, dass das nicht so recht vorwärts gekommen ist (wobei: "gefühlt" ist da auch deutlich mehr Bewegung drin als früher)).
Bin mal gespannt, ob das Werkzeug auch tauglich ist für "spezifischere" Dinge, z.B. ZWave, aber mAn. besteht schon ein gewisser Bedarf nach einer Standardisierung für FHEM auch da, wo es nicht zwingend wäre (wie eben bei ZWave). Mal sehen, können wir ja an anderer Stelle mal vertiefen...
(Für Mitleser: tendenziell wäre das auch ein Weg, standardisierte Konfigurationen für MODBUS zu teilen. Falls da jemand Starthilfe braucht: melden! Ich kenne da aber im Prinzip auch nur das Schlagwort.)
ZitatEs ist eigentlich auch logisch, dass bei der Vielzahl der vorhandenen Module damit etwas unterhalb der Modulebene enststeht, das mit verteilt werden kann.
MAn. hängt das eher weniger an der Zahl der Module, sondern eher an der Art des "Inputs": MQTT2_DEVICE, HTTPMOD und MODBUS "leben" eigentlich vorwiegend durch Attribute, da ist der Weg über (z.B.) attrTemplate einfach sehr viel schneller, was updates und Reaktionen auf (z.B.) firmware- oder Webseiten-updates angeht, auch, weil die User nicht in den Modulcode müssen und daher eher geneigt sind, "patches" zu liefern.
Das mit der Zusatzsoftware ist zweischneidig, weil die (z.B. bei Systemwechseln) ggf. separat nachinstalliert werden muss. Da werden wir also irgendwann die ersten "Einschläge" haben... Insgesamt ist das Verfahren aber an sich soweit transparent (und bekannt), dass das handhabbar sein dürfte.
Von daher: Willkommen an Bord und viel Erfolg mit der Agenda für den Roomba!
Hallo,
das mit den dauerhaft leuchtenden LEDs kann ich für die 675/676 bestätigen.
Eventuell fehlt hir noch ein Poweroff? Oder kann mann die Verbindung des MQTT2 Clients geplant trennen und erneut aufbauen?
Ich bin zu jeder Schandtat (testen) bereit.
edit: nach etwas Geteste - wenn ich das MQTT Topic /blid/disconnect sende disconected der Client kurz conneted sich aber aufgrund von
nextopendelay nach 5 Sekunden wieder. Da hilft auch kein KeepAlive 0. Wenn ich das MQTT2_Client Device lösche geht Robi nach ca.
einer Minute schlafen. Lege ich es wieder an und trage das Passwort ein, ist er sofort wieder erreichbar. Das Licht ist dann aber auch an.
Gruß Andreas
Zuerst müsste man testen, ob die Leuchten tatsächlich mit dem "Connect"-Zustand zusammenhängen. Das kann man z.B. testen, indem in das MQTT2_CLIENT temporär mit einer anderen IP-Adresse umdefiniert.
Einen Poweroff-Befehl gibt es bei meinen Robotern nicht - vlt. mal ein Foto des 676 mit/ohne LED posten?
Wie reagieren die LED, wenn man den Roboter nicht mit FHEM (=localApp) sondern dem Handy (=remoteApp) steuert?
Kann MQTT2_CLIENT den Robot wieder aufwecken, wenn seine LED aus sind?
LG
pah
Hallo,
wenn ich den Client umdefiniere oder wie oben geschrieben aus der Fhem CFG entferne, geht er braf schlafen.
Der Zustand ist unabhängig davon, ob er auf der Ladestation oder im Raum rumsteht. Es leuchtet Power und WLan.
Füge ich den Client wieder ein, wacht er brav auf und lässt sich bedienen. Allerdings sind dann die LED auch wieder an.
Für mein Verständniss fehlt hier in der Implementierung von MQTT2_Client das schon öfter angesprochene Connect/Disconnect.
edit:
Man könnte jetzt quick an dirty mit modify device 'ip vom Mars':8883 arbeiten und das in einen AT packen sowie mit einem Notify
vom Client Device triggern - aber schön ist anders....
Besser wäre ein Disconect sowie regelmäßiges Connect alle 60? Minuten um die Statuswerte zu refreshen.
Dann geht zwar alle 60 Minuten das Licht für 2 Minuten an aber das wäre zu verschmerzen.
Das Connect kann dann ebenfalls per Notify vom MQTT2_Device erzwungen werden für Start und
das Disconnect ausgesetzt werden für z.B. 2h. (Länge Reinigungszyklus)
Gruß Andreas
Gibt es. Setzt man das Attribut disable=1, sollte die Connection aufgelöst werden. disable=0 stellt den Zustand wieder her, in dem sich der Client selbsttätig wieder verbindet.
Bitte mal ausprobieren, was das mit den LED macht.
LG
pah
Hallo,
leider nix - schon getestet. Das Attribut verhindert das Senden von Informationen, der Status bleibt aber connected.
Robi geht also nicht schlafen. Sonst wäre es einfach...
Gruß Andreas
OK, habe einen Feature request abgesetzt. Diskussion erfolgt hier: https://forum.fhem.de/index.php/topic,114299.0.html
LG
pah
Hallo,
vielen lieben Dank.
edit:
Wenn was zu testen ist - ihr Logs braucht - immer Her damit. Gern auch per PM
edit2:
ZitatIch würde das sogar noch weiter treiben: Nicht am CLIENT muss eingestellt werden, wie lange sein KeepAlive dauern soll. Sondern das wäre am DEVICE zu machen, welches dies dann dem CLIENT mitteilt.
Gibt es dann die Möglichkeit mit dem späteren Template zu sagen, für welchen Befehl das Keepalive wie lange dauert?
Für Stop macht da aus meiner Sicht ein anderer Wert Sinn als für Start - wo mann vermutlich das Ende des Reinigungszyklus abwartet um z.B. Koordinaten zu bekommen.
Gruß Andreas
Guten Abend,
mit der neuen Version aus dem SVN disconnected er ordnungsgemäß.
Robi geht dann nach 2 Minuten schlafen. Neue Befehle werden
ordnungsgemäß entgegen genommen und er wacht auf und tut.
Dafür vielen Dank.
Irgendwie is es aber noch nicht ganz rund. Für Werte >6 bei Disconnect after bleibt die Connection einfach opened.
Wenn ich also als Wert 30 Sekunden eintrage, geht er niemals in den disconnect - zumindest was ich in den letzten
20 Minuten testen konnte.
Gruß Andreas
Werde ich morgen testen. Ich habe jetzt die ganze Mimik der Erstellung von Readings in externe Programme ausgelagert, ist sehr viel einfacher. Meine readingList lautet nur noch
$DEVICETOPIC:.* {roomba::reading($EVENT)}
sowie meine setList
start:noArg {roomba::command("start")}
stop:noArg {roomba::command("stop")}
dock:noArg {roomba::command("dock")}
resume:noArg {roomba::command("resume")}
pause:noArg {roomba::command("pause")}
CarpetBoost:true,false {roomba::setting("carpetBoost",$EVTPART1)}
TwoPass:true,false {roomba::setting("twoPass",$EVTPART1)}
VacHigh:true,false {roomba::setting("vacHigh",$EVTPART1)}
BinPause:true,false {roomba::setting("binPause",$EVTPART1)}
OpenOnly:true,false {roomba::setting("openOnly",$EVTPART1)}
jsonMap ist leer. Der zugehörige Code - kann man z.B. in myUtils packen, hängt unten dran. Achtung: Das ist experimenteller Code, Alpha-Version
LG
pah
Die readingList und setList sieht ziemlich cool aus!
Wir sollten das Namensschema-Thema mal allg. (im Developer-Bereich?) zur Diskussion stellen, in der zwave-Geschichte sieht das "etwas aufgedröselter" aus, was mich allerdings auch nicht nur glücklich macht, aber am Funktionsaufruf leichter erkennen läßt, wo der Code eigentlich herkommt. Bauchgefühl ruft nach praktikablem Mittelweg...
Guten Abend in die Runde,
den Alpha Code teste ich morgen Mittag - die Regierung ruft.
Dann mache ich auch noch mal einen Wireshark um zu sehen,
Was da hin und her fliegt und warum bei Disconnect >6 die
Verbindung stehen bleibt.
Gruß Andreas
EDIT: Ich habe gerade die Aufrufe in der readingList ebenso wie in der setList grundlegend geändert. Ist nötig, weil ich bei der Kartenerzeugung Referenzen auf das Device benötige. Nachstehend die aktuellen Definitionen, so werden sie auch bleiben.
Der Roomba-spezifische Code zur Erzeugung von Readings und zum Setzen diverser Parameter umfasst jetzt ca. 400 Zeilen, ich habe ihn darum erst einmal in ein Modul 99_RoombaUtils.pm ausgelagert. Wo man diesen Code später hinsteckt, lasse ich für den Moment noch offen - im Moment genügt es, dass 99_RoombaUtils beim FHEM-Start in /opt/fhem/FHEM liegt. Man kann das natürlich auch von Hand laden.
readingList:
$DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
Die setList ist jetzt wegen der einzustellenden Saugprogramme etwas länger geworden.
start:noArg {roomba::command($NAME,"start",$EVENT)}
stop:noArg {roomba::command($NAME,"stop",$EVENT)}
dock:noArg {roomba::command($NAME,"dock",$EVENT)}
resume:noArg {roomba::command($NAME,"resume",$EVENT)}
pause:noArg {roomba::command($NAME,"pause",$EVENT)}
CarpetBoost:true,false {roomba::setting($NAME,"carpetBoost",$EVENT)}
TwoPass:true,false {roomba::setting($NAME,"twoPass",$EVENT)}
VacHigh:true,false {roomba::setting($NAME,"vacHigh",$EVENT)}
BinPause:true,false {roomba::setting($NAME,"binPause",$EVENT)}
OpenOnly:true,false {roomba::setting($NAME,"openOnly",$EVENT)}
ProgHold:true,false {roomba::setting($NAME,"schedHold",$EVENT)}
ProgSun:time {roomba::setsched($NAME,0,$EVENT)}
ProgMon:time {roomba::setsched($NAME,1,$EVENT)}
ProgTue:time {roomba::setsched($NAME,2,$EVENT)}
ProgWed:time {roomba::setsched($NAME,3,$EVENT)}
ProgThu:time {roomba::setsched($NAME,4,$EVENT)}
ProgFri:time {roomba::setsched($NAME,5,$EVENT)}
ProgSat:time {roomba::setsched($NAME,6,$EVENT)}
Das Modul befindet sich in der Anlage.
Nächster Punkt auf der Agenda: Karte zusamenbauen mit SVG. Funktioniert schon teilweise, der abgefahrene Pfad wird nach dem Ende des Durchlaufs in dem Reading cmPath abgelegt.
Vielleicht könnte jemand anders mal Folgendes probieren:
1. Robot mit einem "start" vom Dock entfernen.
2. Robot mit einem "stop" anhalten.
3. Mit einem geänderten set-Befehl die gegenwärtige Positionauf irgendetwas _setzen_
4. Robot mit einem "dock" zum Dock schicken.
Die Frage steht nämlich im Raum, wie man die Kiste dazu bringen kann, an eine bestimmte Position zu fahren. Orientiert sie sich nur am IR-Signal der Docking Station? Was, wenn dieses nicht empfangen wird - geht es dann nach der Position?
LG
pah
OK, hier die erste mit FHEM erzeugte Karte. Roomba 960, saugte im Dachgeschoss. Schränke etc. sind gut erkennbar, ebenso der Treppenabsatz.
Die acht-förmigen Strukturen links sind Stuhlbeine (in der Mitte ein Tisch), die U-förmige Aussparung links oben ist ein Sessel, die 5-blasige Struktur rechts ein Schreibtischstuhl.
Unangenehm: Die Kiste läuft nicht senkrecht zur Wand los. Das bedeutet, dass man ggf. aus den Daten irgendwie ableiten muss, um welchen Winkel das Koordinaten gedreht werden müssen, um das so in einen Grundriss einzupassen.
LG
pah
Guten Abend,
erstmal zur Map -> genial.
Ich bin leider nicht früher zum Wireshark gekommen - kankes Kind... :(
Zum Thema Timeout > 5
Es ist tatsächlich so, dass alle 5 Sekunden vom Roomba ein Status kommt und er deswegen nicht in den Disconnect geht.
Das Timeout muss also doch eingehende Signale für den Timeout-Timer ignorienen. Doch noch eine "Bestellung"....
Siehe Screenshot vom Wireshark
Gruß Andreas
Wieso ? Mit einem Timeout von 5 Sekunden kann man doch gut leben.
LG
pah
Guten Abend,
prinzipiell schon, aber dann muss man ihn während der Reinigung pollen um die Position und die Statuswerte zu erhalten. Meine Idee war eher für verschiedene Aufgaben verschiedene Timeouts mitzugeben. Quasi für Start z.B. 2h um eben solange Stauswerte zu erhalten oder für Dock 10 Minuten - länger braucht er nicht zum Finden des Docks.
Gruß Andreas
Seltsam. Ich erhalte Status und Position auch bei einem Timeout von 5 Sekunden. Und zwar bei beiden Kisten.
LG
pah
Hallo,
ich habe jetzt noch mal getestet. Wenn er mehr als 5 Sekunden DisconnectTimeout eingestellt bekommt, macht er keinen Disconnect.
Dies geschieht aufgrund der eingehenden Statusmeldungen. Stelle ich ihn auf 5 Sekunden ein, disconnected er den MQTT Client.
Das bedeutet, dass er das MQTT Abonnement sauber beendet. Damit bekommt er vom MQTT Server des Roombas keine weiteren
Informationen mehr mitgeteilt - ergo auch keine Statuswerte.
Gruß Andreas
ZitatDamit bekommt er vom MQTT Server des Roombas keine weiteren Informationen mehr mitgeteilt - ergo auch keine Statuswerte.
Ich verstehe noch nicht, warum erwaehnenswert ist, dass ohne eine Verbindung keine Daten ausgetauscht werden. Uebersehe ich etwas?
Guten Morgen,
Ja ich hatte versucht zu erklären, dass ein Disconnect Timeout >5 nicht zum Disconnect führt, da vom Roboter Statusdaten kommen. Ich habe aber Timeout und nicht DisconnectTimeout geschrieben, was vermutlich zu Missverständnissen führte. Siehe die letzten Posts.
Daher habe ich das mit dem Disconnect noch einmal explizit beschrieben, wobei es natürlich wie erwartet dem Protokoll entspricht.
Gruß Andreas
Ich verstehe das Problem auch nicht - bei mir laufen die beiden Kisten wie gewünscht.
LG
pah
Hallo die Herren,
also bei den 675/676 verhält es sich folgendermaßen:
Stelle ich ein DisconnectTimeout kleiner/gleich 6 ein, disconnected er nach der eingestellten Anzahl an Sekunden. Dabei ist es völlig egal, ob er in einem Reinigungszyklus ist oder auf dem Dock steht. Offensichtlich überträgt er hier beim Reinigen auch nur alle ca. 6 Sekunden etwas (Position,...)
Stelle ich ein DisconnectTimeout größer 6 ein bleibt die Verbindung dauerhaft bestehen. Auch hier ist es egal in welchem Zyklus er sich befindet. Es werden regelmäßig Statusdaten übertragen.
Wenn ich mir was wünschen dürfte, dann die Implementierung von Connect und Disconnet als Methoden für den MQTT2_Client. Dann könnte mann mit Notifys und AT Timern arbeiten.
Also z.B.
Wenn Status docked, dann disconnect.
Stündlich einen Connect und nach 2 Minuten wieder ein Disconnect um die Aktuellen Akkustände zu erhalten.
usw usf
Vermutlich verhält es sich bei den größeren Modellen der Roomba anders mit den Intervallen (Mehr Rechenleistung?)
Gruß Andreas
Ich habe keine Problem, das mit den Connects und Disconnects zu verstehen. Allerdings verstehe ich nicht, welche Auswirkung das auf das Verhalten der Roboter haben sollte. Nur im Schlafmodus sollte die Verbindung disconnected sein, damit die Kiste sich wirklich ausruht und die LED ausgehen.
Nachtrag: ein automatischer Disconnect von wenigen Sekunden führt bei einem langsamen Start des Roboters dazu, dass die Verbindung nicht mehr besteht. Gleiches gilt, wenn der Robot durch die App gestartet wird - der Roboter kann eben nicht von sich aus die Verbindung mit FHEM herstellen. Damit kommen in FHEM auch keine Positionsupdates mehr an. Merkt man aber natürlich und kann - z.B. mit dem Setzen eines bereits gesetzten Attributes - sofort für einen Reconnect sorgen. Da die Positionsupdates ca. 1x pro Sekunde kommen, wird die Verbindung dann offengehalten.
Natürlich könnte man auch mit einem "get" bestimmte Daten abfragen - allerdings habe ich den MQTT-Topic zur Statusabfrage noch nicht herausgefunden. Das nochmalige Setzen eines Attributes löst die Sendung dieser Statusinformationen aus.
Also aus meiner Sicht alles in Butter, und das System ist problemlos ohne weitere Änderungen an MQTT_Device oder _Client einsetzbar.
LG
pah
Hallo,
leider nicht, denn unter 6 Sekunden Disconnected er immer, über 6 Sekunden Bleibt die Verbindung für immer bestehen.
Dabei ist es völlig egal in welchem Zustand sich der Robooter befindet.
Die Positionsupdates kommen beim 675 leider auch nur - wie oben geschrieben alle 6 Sekunden.
Attribute im Robotter sinnlos hin und her setzen möchte ich eher nicht. Get würde ein pollen des Robotters verlangen.
Wenn ich das Attribut DisconnectAfter per Notify für die Reinigung verändere erscheint im Fhem das rote Fragezeichen...
Gruß Andreas
Hallo,
noch ein Nachsatz zum 99_RoombaUtils.pm
Zeile 174:
}elsif( $cmd =~ /("stop")|("dock")/){
Stop und Dock funktioniert bei mir nur mit zus. eingefügten Anführungszeichen.
Das haben Sie aber bestimmt auch schon selbst herausgefunden - nur für Leute die hier mitlesen...
Ich habe jetzt set connect bzw. disconnect hinzugefuegt.
@Rudi: Danke.
@Sturi
Zitat}elsif( $cmd =~ /("stop")|("dock")/){
Äh - nö. Das funktioniert korrekt auch ohne Anführungszeichen, wi eman auch leicht unter https://regex101.com/ testen kann.
Allerdings fliegt das auch umgehend wieder heraus - dann man kann nicht 100 kB String in ein FHEM_Reading packen.
Ich knobele noch an einem Algorithmus für die Nachbearbeitung der Karten. Denn tatsächlich läuft der Roboter durchaus in leicht unterschiedlicher Richtung los.
LG
pah
Hallo in die Runde,
@Herr König,
vielen Dank für die viele Arbeit. Ich werde heute Abend respektive morgen Vormittag ausgiebig testen.
@Herr Henning,
Ohne die Anführungszeihen kommt bei mir leider LastCommand Start (oder was auch immer ich vorher gedrückt habe)
wenn ich auf Stop oder Dock drücke...mit Anführungszeichen funktioniert es.
Das mag am Perl 5.20.2 im Docker Container liegen.
Prallel dazu wirft er den Fehler:
2020.09.23 15:51:27 1: ERROR evaluating my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $NAME= $evalSpecials->{'%NAME'};{roomba::command($NAME,"stop",$EVENT)}: Can't use an undefined value as an ARRAY reference at ./FHEM/99_RoombaUtils.pm line 175.
Nach Einbau der Hochkommata ist der Fehler weg. Ob das nun ursächlich war.... wenn es rausfliegt ist es sowieso egal.
->Notiz an mich selbst Container updaten!
Zur Ausrichtung der Map:
Eventuell den Winkel der Karte zu zwei Berührungspunkten mit der Wand links und rechts neben der Dockingstation abgleichen.
Das funktioniert aber nur, wenn die Dockingstation an einer glatten Wand steht - was aber in den seltendsten Anwendungsfällen
so sein wird. Damit wäre es nicht universell einsetzbar.
Alternativ können wir mal testen, ob mann eine virtual Wall als Fixpunkt einsetzen kann und ob dazu Stauswerte zurückkommen,
respektive wie er die Virtual Wall erkennt.
Wenn es Testcode gibt und nirgendwo eine Virtual Wall vorhanden ist, würde ich zu Testzwecken eine bestellen.
Gruß Andreas
ZitatOhne die Anführungszeihen kommt bei mir leider LastCommand Start (oder was auch immer ich vorher gedrückt habe) wenn ich auf Stop oder Dock drücke...mit Anführungszeichen funktioniert es.
Das ist vermutlich wie bei der Homoeopathie. Wissenschaftlich nicht zu erklaeren :)
Ich habe 3 Virtual Walls - da gibt es kein Datum in den Statuswerten, dass er die getroffen hat. Ich habe schon Vorstellungen, wie man die Karten aufarbeiten kann.
Anbei zur Belustigung die Karte zweier Läufe in meinem Dachgeschoss - so richtig deterministisch ist das nicht.
LG
pah
Ich schaffe es immer noch nicht, dass sich mein MQTT2_Client mit meinem Roomba verbindet.
Im log sehe ich nur:
2020.09.27 23:13:34 5: HttpUtils url=https://192.168.178.62:8883/
2020.09.27 23:13:34 4: IP: 192.168.178.62 -> 192.168.178.62
2020.09.27 23:13:36 4: HttpUtils: https://192.168.178.62:8883/: Can't connect(2) to https://192.168.178.62:8883: SSL connect attempt failed error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
Bin für jede Hilfe dankbar.
Gruß
Carlos
SSL-Version richtig gsetzt ?
LG
pah
Hallo Carlos,
Poste doch mal bitte deine Konfiguration.
Ist dein Roomba in der App eingebunden und hat er die aktuelle Firmware?
Gruß Andreas
Hallo,
Meine device sieht genau so aus das wie von pah in post 29, deswegen bat ich da um die Daten:
defmod myRoombaClient MQTT2_CLIENT 192.168.x.y:8883
attr myRoombaClient SSL 1
attr myRoombaClient autocreate simple
attr myRoombaClient clientId 3.................20
attr myRoombaClient mqttVersion 3.1.1
attr myRoombaClient room Roomba
attr myRoombaClient sslargs SSL_version:SSLv23
attr myRoombaClient username 3.................20
attr myRoombaClient verbose 5
Mein Roomba ist in der app eingebunden und hat die Firmware 2.4.6-3 vom 14 Juni 2018.
Wie zuvor auch schon geschrieben funktioniert die Anbindung über rest980 als HTTPMod device mit den gleichen Daten (BLID/password).
Gruß
Carlos
Hallo,
ich vermute mal es liegt, an der zu aktuellen OpenSSL auf deinem Host System.
Siehe https://wiki.debian.org/ContinuousIntegration/TriagingTips/openssl-1.1.1 (https://wiki.debian.org/ContinuousIntegration/TriagingTips/openssl-1.1.1)
Schau mal bitte in deine \etc\ssl\openssl.conf
Da sollte es einen Wert
CipherString = DEFAULT@SECLEVEL=2
geben. Diesen mal mit # ausremmen oder auf 1 heruntersetzten.
Interessant wäre in dem Zusammenhang auch sie Ausgabe von
openssl version
Gruß Andreas
Hallo Andreas,
Du hattest recht.
Mit CipherString = DEFAULT@SECLEVEL=1
funktioniert mein Client jetzt.
Vielen Dank für den Tip, da wäre ich nie drauf gekommen.
Zur Vollstandigkeit:
OpenSSL 1.1.1d 10 Sep 2019
Gruß
Carlos
Ich stelle hier mal etwas zur Abstimmung.
Bei der in Arbeit befindlichen Kartenerstellung taucht das Problem auf, dass zur Erstellung reproduzierbarer Karten (gibt es in der Form bei iRobot nicht, wohlgemerkt) die Bounding Box des Raumes angegeben werden muss.
Möglichkeit A: Angabe maximale Breite, maximale Tiefe des Raumes, sowie Position der Docking Station in Zentimetern von linker Kante und "unterer" (naher) Kante, sowie Startrichtung des Roboters (Nord, Süd, Ost, West). Also 4 Zahlen plus Richtungsangabe
Möglichkeit B: Angabe der Raumgrenzen in Bezug auf die Docking Station (4 Zahlen) plus Startrichtung.
Ich favorisiere Möglichkeit A.
Als problematisch bei der Auswertung erweist sich noch, wenn man unterschiedliche Räume saugen lässt (z.B. die Tür zur Küche mal offen und mal geschlossen ist).
LG
pah
Hallo pah,
ich würde A favorisieren.
Ich hatte überlegt, ob man die Karten einzeln betrachten sollte oder ob sich der komplette Grundriss nicht nach mehren
Reinigungszyklen automatisch ergibt, wenn man versucht die Eckpunkte zu finden und über Näherung zu matchen....
Hier würde sich dann auch die Tür offen / geschlossen Problematik erledigen, da er ja irgendwann alles entdeckt.
Was dabei aus meiner Sicht jedoch auf keinen Fall erfolgen darf, ist, dass er verschiedene Startpunkte hat.
Meine Frau nimmt ihn z.B. ganz gerne mal und stellt ihn in die Veranda um dort auf Start zu drücken.
Das ließe sich dann nur durch Karten aussortieren, bei denen er bei Start nicht den Status docked hatte, lösen.
Anbei noch mal vielen Dank für die geleitete Arbeit. Bei mir funktioniert er jetzt mit dem Disconnet / Connect wie gewünscht.
Gruß Andreas
Das Problem besteht darin, dass die Kiste mit unterschiedlichen Winkeln losläuft. Und nicht unterscheiden kann, ob das Hindernis an der Position X ein temporär dort hingestellter Sessel ist, eine geschlossene Tür oder - wegen des geänderten Laufwinkels - einfach die Wand des bekannten Raumes. Es ist nicht einfach, das aus den Daten herauszufieseln.
Derzeit gehe ich davon aus, dass es jeweils ein Array aus verschiedenen Breiten und Tiefen gibt.
Sagen wir für die Breite 11.5 m und 9.5 m, für die Tiefe 5.5 variabel bis 7.5 m.
Damit gäbe es dann 4 mögliche Bounding Boxes, in die man die übermittelten Koordinaten einpassen könnte - aus diesem Einpassen ergäbe sich auch der Laufwinkel.
LG
pah
Hallo,
die Karte könnte doch auch anders erstellt werden. Jetzt ist es so, dass die einzelnen Koordinaten in gewissen zeitabständen gespeichert werden und daraus die Karte erstellt wird.
Wäre es nicht möglich, wenn der Roboter gegen die Wand oder ein Hindernis fährt einen Koordinatenpunkt zu speichern und daraus dann die Karte zu erstellen ? Das müssten dann doch an einer Wand eine relativ gerade Strecke geben. Ein reading des Schalters der Leiste gibt es meine ich doch, irgendwas mit bumper (bin gerade nicht zu Hause).
Grüssle, Jens
Die Koordinaten kommen in einer anderen Message, als die Bumper Messages. Außerdem sind diese Bumper Messages nach meinem Dafürhalten keine aktuellen Statusmeldungen, sondern nur Zähler. Und drittens sind die Bumper Messages sehr viel seltener, als die Koordinatenangaben
Da lasse ich mich aber gerne eines Besseren belehren - vielleicht könnte jemand das austesten, der die ungefilterten JSON-Daten mitschreibt.
Einen anderen Ansatz werde ich noch ausprobieren, nämlich den Winkel mitzuloggen.
Anbei die Karte meines Dachgeschosses mit drei unterschiedlichen Läufen. An ein paar Stellen gibt es deutliche Abweichungen, weil ein Stuhl verrückt wurde. Wichtiger sind aber die Abweichungen an den Kanten - die zeigen, dass diese Art der Navigation eben doch ziemlich ungenau ist.
LG
pah
Vorschlag eines Unbeteiligten :)
Koennte man die Liniendicke in der Zeichnung auf die Breite der Kehrflaeche erweitern, halb durchsichtig, damit man die Kreuzungen erkennt?
Das habe ich in SVG auch schon gemacht (das Ganze ist eine SVG-Grafik). Ist nicht sonderlich erhellend.
Wo ich dich gerade dran habe: im MQTT2_CLIENT fehlen m.E. die connect/disconnect im Modul noch in der Liste der set-Befehle. Sie tauchen zwar in der CommandRef auf, aber ein set ... connect liefert nur die Fehlermeldung, dass nur "publish" und "password" erlaubt sind.
LG
pah
Hallo,
Da muss ich wiedersprechen.
Stimmt. War aus irgendeinem Grund noch das alte Modul am Laufen.
LG
pah
Hallo,
zum Thema MQTT und Cipher Level gibt es wohl schon was in der TCPUtils.pm Das müstte nur im MQTT Modul eingebaut werden...
https://forum.fhem.de/index.php/topic,89745.msg1088503.html#msg1088503 (https://forum.fhem.de/index.php/topic,89745.msg1088503.html#msg1088503)
Gruß Andreas
ZitatDas müstte nur im MQTT Modul eingebaut werden...
Alternativ setzt man
attr MQTT2_CLIENT sslargs SSL_version:SSLv23
(oder so, ich will immer noch kein SSL Experte werden)
Hallo,
das scheint leider nicht zu greifen - > siehe
https://forum.fhem.de/index.php/topic,114166.msg1088298.html#msg1088298 (https://forum.fhem.de/index.php/topic,114166.msg1088298.html#msg1088298)
und die folgenden 3 Posts.
Ich musste es nach dem Upgrade des Docker Images auch in der OpenSSL.conf setzen.
Gruß Andreas
sslargs ist die generische Version von sslVersion, erlaubt alle IO::Socket::SSL Parameter zu setzen, und nicht nur SSL_version. Weiterhin hat es Vorrang ueber sslVersion.
Habs gerade ueberpruft, es wird von MQTT2_CLIENT weitergegeben und in TcpServerUtils ausgewertet.
Ich wuesste nicht, was ich daran aendern soll.
Hallo,
dann greift es in der TCPServerUtils.pm nicht oder die
TCPServerUtils (IO::Socket::SSL) setzt es nicht über die Default Arg im OpenSSL.
Woran es liegt vermag nur einer der Programmierer zu sagen.
Als Workaround kann man halt wie oben beschrieben die
CipherString = DEFAULT@SECLEVEL=1
setzen. Das ist aber unschön weil systemweit.
Es schaltet SHA1 ein....
Bei mir funktioniert es so - erschlag nicht den Boten - er versucht nur den scheinbaren Bug zu kommunizieren.
In welchem der beteiligten Module er liegt kann er auch nicht sagen ;)
Gruß Andreas
Ich habe es vorhin in TcpServerUtils.pm ausgegeben, da war es richtig.
Wenn die Datei in /etc diese Einstellung ueberschreibt, dann ist das mAn ein Bug.
Was passiert, wenn man diese Datei loescht bzw. zur Seite schiebt?
Hallo,
dann funktioniert es. Es ist aber schwer zu sagen, welche systemrelevanten Auswirkungen das hat.
Gruß Andreas
Hallo zusammen,
ich hätte einen Roomba 980 und einen nagelneuen Braava Jet M6 beizusteuern, benötige jedoch eine zusammenfassende Anleitung (=Wiki-Eintrag) für Eure bisher hier nerdigen Fortschritte.
Im Wesentlichen schwebt mir eine Einbindung in FHEM vor, um anschließend per Homebridge die Geräte per Homekit-App & Siri zu aktivieren/deaktivieren.
Was ist denn nerdig daran, einen MQTT2_CLIENT mit dem Roomba zu verbinden?
LG
pah
Bei mir scheitert es derzeit noch an den Grundlagen wie dem Herausfinden von clientID oder einem Passwort für den Gerätezugriff. Ich hoffe, am Wochenende Zeit zu finden.
Ich bin noch nicht dazu gekommen, dass Holen des Passworts in FHEM zu realisieren. Einfachster Weg im Moment: Das hier
https://github.com/NickWaterton/Roomba980-Python
installieren und "python3 getpassword.py" ausführen.
LG
pah
Guten Abend,
wenn du das aber in fhem realisieren willst (getpassword) dann ist Template für MQTT Geschichte und es wird doch ein eigenes Modul/Helper Modul?
Gruß Andreas
Nicht notwendigerweise. Es muss sowieso eine Menge spezieller Code hinzugeladen werden - da kommt es auf ein Unterprogramm auch nicht mehr an. Ich halte nichts davon, diesen Code direkt im template zu lagern - er sollte vielmehr separat, z.B. im lib-Ordner liegen.
LG
pah
Noch etwas zum Diskutieren. Die vier Einstellungen
state_reported_noAutoPasses
state_reported_noPP
state_reported_openOnly
state_reported_twoPass
machen mir noch etwas Aufwand.
openOnly ist klar -> Kantenreinigung ein oder aus.
noAutoPasses true bedeutet: Einfachreinigung oder Zweifachreinigung fest eingestellt, keine autmatische Umschaltung
twoPass true bedeutet, Zweifachreinigung fest eingestellt.
Was wäre, wenn beide false sind? Was bedeutet PP bzw. noPP?
Ich knobele immer noch an der Kartenerstellung herum. So wie es aussieht, benutzt die Kiste bei der Kartenerzeugung entweder irgendwelche Signale der Bumper, die nicht nach außen geleitet werden. Oder irgendeine Kombination des Winkels mit den Koordinaten.
Sehen kann man das sehr schön an den von der App gezeigten Karten für unvollständige Läufe: Manche der Kanten enthalten dann fett gezeichnete Linien, andere nicht.
Jede Unterstützung beim Herausfinden ist hier willkommen.
LG
pah
Zitat von: carlos am 28 September 2020, 10:52:47
Hallo Andreas,
Du hattest recht.
Mit CipherString = DEFAULT@SECLEVEL=1
funktioniert mein Client jetzt.
Vielen Dank für den Tip, da wäre ich nie drauf gekommen.
Zur Vollstandigkeit:
OpenSSL 1.1.1d 10 Sep 2019
Gruß
Carlos
Habe die gleiche Problematik wie Du, habe auch o.g. Idee geändert, aber es bleibt bei mir weiterhin "disconnected".
Übrigens läuft bei mir das alte Roomba980-Modul! Darüber kann ich meinen Roomba980 starten & beenden. Über dessen modulinternes "DiscoverRoomba" erhielt ich die clientID und auch ein krypisches Passwort. Wird letzteres für mqtt2 gar nirgens benötigt?
Internals:
BUF
CFGFN
DEF 192.168.178.21:8883
DeviceName 192.168.178.21:8883
FUUID 5f787e4f-f33f-4dec-1624-9c568cbd4eeabc57
NAME RoombaFegerClient
NEXT_OPEN 1601732659
NR 39720
PARTIAL
SSL 1
STATE disconnected
TYPE MQTT2_CLIENT
clientId 31**********40
connecting 1
lastMsgTime 1601732192.72541
nextOpenDelay 5
READINGS:
2020-10-03 15:44:14 state disconnected
sslargs:
SSL_version SSLv23
Attributes:
SSL 1
autocreate simple
clientId 31**********40
mqttVersion 3.1.1
room Roomba
sslargs SSL_version:SSLv23
username 31**********40
verbose 1
Hallo,
das Passwort musst du im MQTT2_Client eintragen. Da gibt es oben ein Dropdown Conect usw.
Gruß Andreas
Zitat von: Sturi2011 am 03 Oktober 2020, 16:20:14
Hallo,
das Passwort musst du im MQTT2_Client eintragen. Da gibt es oben ein Dropdown Conect usw.
Gruß Andreas
Moin,
habe gestern zur Sicherheit nochmal mein gesamtes FHEM System geupdated. Seither habe ich in Deinem besagten Dropdown eine Auswahlmöglichkeit "connect" (die ich vorher nicht hatte) und habe dort das Passwort eingetragen; übrigens sehr kryptisch, mag das stimmen? (Der Doppelpunkt am Anfang gehört dazu!)
2020-10-04 08:18:18 MQTT2_CLIENT RoombaFegerClient connect :1:151***********WnO
Eine Verbindung stellt sich leider nicht her ,wobei ich mich frage, ob der Roomba dafür in irgend einem bestimmten Status stehen muss?
Hallo,
einen bestimmten Status benötigt er nicht,
Eine aktuelle Firmware aus der App solltest
du ihm schon verpasst haben...
Das Passwort soll kryptisch sein....die Leerzeichen
gehören allerdings nicht dazu.
Gruß Andreas
Roboter-Software: 2.4.6-3 (Roomba 980), lt App ist das der neueste Stand ???
Hallo,
dann stelle mal verbose 5 ein und poste die Logs.
Ich komme allerdings erst morgen dazu weiter zu
lesen - mein großer hat heute Konfirmation.
Gruß Andreas
Zitat2020.10.04 10:02:18 5: HttpUtils url=https://192.168.178.21:8883/
2020.10.04 10:02:18 4: IP: 192.168.178.21 -> 192.168.178.21
2020.10.04 10:02:19 4: HttpUtils: https://192.168.178.21:8883/: Can't connect(2) to https://192.168.178.21:8883: SSL connect attempt failed error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
trotz
CipherString = DEFAULT@SECLEVEL=1
und alternativ
#CipherString = DEFAULT@SECLEVEL=1
Reicht es die genannte Datei zu editieren, oder muss danach zusätzlich noch etwas restarted werden o.ä.?
Hallo,
wie heißt es so schön - reboot tut gut.
Wenn es dei dir im Docker Container
läuft vorher ein comit - sonst sind die
Änderungen flöten.
Gruß Andreas
oh my godness ;D ;D ;D
ZitatSTATE opened
Zitat
2020.10.04 12:58:23 1: 192.168.178.21:8883 disconnected, waiting to reappear (RoombaFegerClient)
2020.10.04 12:59:01 1: 192.168.178.21:8883 reappeared (RoombaFegerClient)
2020.10.04 12:59:01 2: autocreate: define MQTT2_3145*********40 MQTT2_DEVICE 31***********40 RoombaFegerClient
2020.10.04 12:59:01 2: autocreate: define FileLog_MQTT2_31*******40 FileLog ./log/MQTT2_31********740-%Y.log MQTT2_31*********740
2020.10.04 12:59:51 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"signal":{"rssi":-39,"snr":50}}}}
2020.10.04 12:59:51 5: RoombaFegerClient: dispatch autocreate=simple\00031*********740\000wifistat\000{"state":{"reported":{"signal":{"rssi":-39,"snr":50}}}}
Läuft 8)
OK, langsam nehmen auch die Karten etwas Form an.
Zunächst einmal anbei meine Datei mit dem "Spezialcode", sowie ein Listing eines meiner Roboter
Internals:
CID 3...0
DEF 3...0
DEVICETOPIC 3...0
FUUID 5f5e176a-f33f-a726-7839-10b15519c0efcc9f
IODev RoombaFegerClient
LASTInputDev RoombaFegerClient
MSGCNT 15009
NAME RoombaFeger
NR 122
RoombaFegerClient_MSGCNT 15009
RoombaFegerClient_TIME 2020-10-04 12:16:53
STATE Charging (100 %)
TYPE MQTT2_DEVICE
READINGS:
2020-10-04 12:16:50 audioActive 0
2020-10-04 12:16:50 battery 100
2020-10-04 12:16:51 cmArea 37.3 m²
2020-10-04 12:16:50 cmBinFull 0
2020-10-04 12:16:51 cmCycle none
2020-10-04 12:16:51 cmError None
2020-10-04 12:16:51 cmErrorD Kein Fehler
2020-10-04 12:16:51 cmExpire Never
2020-10-04 12:16:51 cmInitiator localApp
2020-10-04 12:16:51 cmNotReady 0
2020-10-04 12:16:51 cmPhase charge
2020-10-04 12:16:51 cmPhaseD Wird geladen
2020-10-04 12:16:51 cmPhaseE Charging
2020-10-04 12:16:51 cmTime 57 min
2020-10-04 12:16:51 lastCommand resume
2020-10-04 12:16:51 lastCommandInitiator localApp
2020-10-04 11:11:00 position (-513,-22)
2020-10-04 11:11:00 positionTheta 49
2020-10-04 12:16:51 progWeek [Sun:none,Mon:none,Tue:none,Wed:none,Thu:none,Fri:none,Sat:none]
2020-10-04 12:16:51 sBinPause true
2020-10-04 12:16:51 sCarpetBoost false
2020-10-04 12:16:51 sOpenOnly false
2020-10-04 12:16:51 sSchedHold false
2020-10-04 12:16:51 sTwoPass false
2020-10-04 12:16:51 sVacHigh false
2020-10-04 12:16:53 signalRSSI -51
2020-10-04 11:10:20 state NoAutoPasses
Attributes:
IODev RoombaFegerClient
devicetopic 3...0
readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
room Haus
setList start:noArg {roomba::command($NAME,"start",$EVENT)}
stop:noArg {roomba::command($NAME,"stop",$EVENT)}
dock:noArg {roomba::command($NAME,"dock",$EVENT)}
resume:noArg {roomba::command($NAME,"resume",$EVENT)}
pause:noArg {roomba::command($NAME,"pause",$EVENT)}
CarpetBoost:true,false {roomba::setting($NAME,"carpetBoost",$EVENT)}
TwoPass:true,false {roomba::setting($NAME,"twoPass",$EVENT)}
NoAutoPasses:true,false {roomba::setting($NAME,"noAutoPasses",$EVENT)}
NoPP:true,false {roomba::setting($NAME,"noPP",$EVENT)}
VacHigh:true,false {roomba::setting($NAME,"vacHigh",$EVENT)}
BinPause:true,false {roomba::setting($NAME,"binPause",$EVENT)}
OpenOnly:true,false {roomba::setting($NAME,"openOnly",$EVENT)}
ProgHold:true,false {roomba::setting($NAME,"schedHold",$EVENT)}
ProgSun:time {roomba::setsched($NAME,0,$EVENT)}
ProgMon:time {roomba::setsched($NAME,1,$EVENT)}
ProgTue:time {roomba::setsched($NAME,2,$EVENT)}
ProgWed:time {roomba::setsched($NAME,3,$EVENT)}
ProgThu:time {roomba::setsched($NAME,4,$EVENT)}
ProgFri:time {roomba::setsched($NAME,5,$EVENT)}
ProgSat:time {roomba::setsched($NAME,6,$EVENT)}
startdir east
startx 1100
starty 120
stateFormat cmPhaseE (battery %)
userattr startdir:north,west,south,east startx starty
webCmd start:pause:resume:stop:dock
Also mit ganz einfacher readingList und klar definierter setList. Die Attribute für Startpunkt und Startrichtung sind im Moment noch bedeutungslost - sie definieren später die Ausrichtung der Karte. Programmierung und Setzen von Optionen funktioniert problemlos (wobei ich immer noch nicht weiß, was noPP bedeuten soll...)
Es werden sehr viel weniger Readings angelegt, als beim per autocreate erzeugten Device - das mach m.E. mehr Sinn.
Zusätzlich mache ich tagsüber alle 5 Minuten einen Connect - es kann ja sein, dass jemand die Kiste per App gestartet hat.
Bei den Karten eliminiere ich inzwischen alle Wegpunkte, bei denen sich der Fahrwinkel nicht ändert (macht dann nur noch so 2500 Punkte bei einem Lauf). Diese Punkte können abgefragt werden durch {Dumper($defs{'RoombaFeger'}->{helper})}. Anbei die Grafik einer Fahrt duch 2 Räume im Erdgeschoss. Mittels eines Graham Scan-Verfahrens lässt sich schnell die konvexe Hülle der Fahrtpunkte ermitteln (Rote Linie, sehr viel weniger Punkte), die muss ich jetzt nur noch automatisch an die "theoretische" Hüllkurve anpassen. Beziehungsweise in diesem Geschoss an 4 verschiedene Hüllkurven, da Küche, Garderob und Gästebad nicht immer gesaugt werden.
Als problematisch erweist sich die ziemlich ungenaue Messung.
LG
pah
Aus Interesse: welches Ziel verfolgst Du mit den Karten?
Nach 2 Jahren Roomba kann ich der Karte als Reinigungsergebnis keinen Mehrwert abnehmen. Selbst die Kartierung in Zonen nutzen wir nicht.
Mein persönliches Ziel ist die Einbindung beider Roboter, sodass ich im Idealfall am Ende eine definierte Ablaufkette in FHEM habe, die z.B. mitten in der Nacht durchläuft und das gesamte Erdgeschoss erst saugt und dann durchwischt.:
1.) Licht in Küche, Esszimmer, Wohnzimmer einschalten
2.) Roomba 980 starten und nach Ende (=Status: Dock/Charging)
3.) Nach Ende Braava starten und nach Ende (=Status: Dock/Chariging)
4.) Licht wieder ausschalten
Erstens interessiert mich das mathematisch.
Zweitens ist wohl in einem der nächsten Firmware-Updates die Möglichkeit drin, gezielt bestimmte Zonen anzusteuern.
Und drittens hat das mit den Karten, wenn es funktioniert, einen hohen WAF. Wo die Kiste gereinigt hat, ist dabei eher egal - aber die Frage, wo sie gerade saugt, und wo man sie hinbewegen möchte, ist sehr interessant.
Wischen fällt hier flach - nagelneues geöltes Eichenparkett. Also 2x Roomba, kein Braava
LG
pah
Klare Aussage, ist verstanden.
Vielleicht ist der Braava zukünftig von einem kompetenteren User wie mir hier einzubringen. Ich finde derzeit keine Möglichkeit (Google), irgendeine Verbindung zu ermöglichen.
Auf Dein Parkett bin ich neidisch, wobei die rund 40qm Fliesen hier recht praktisch sind: 2 eigene Kinder, 1 Hund und seit dem Frühjahr täglich 3 Tageskinder bei meiner Frau, hinterlassen in Summe zum Feierabend regelmäßig Arbeit für beide Roboter. Momentan starten wir die Geräte abends manuell nacheinander. Morgens ist dann alles frisch sauber, bevor die Terrorzwerge von vorn beginnen ;D
ZitatAuf Dein Parkett bin ich neidisch
Nicht doch. Haben wir auch erst machen lassen, nachdem das jüngste von 3 Kindern in absehbarer Zeit das Studium beenden und ausziehen wird. Komm Zeit, komm Luxus.
Und warum sollte der Braava anders funktionieren, als der Roomba? Was sagt er denn bei einem Verbindungsversuch mit einem MQTT2_CLIENT? Kann man ein Passwort holen?
LG
pah
Ich war bisher nicht im Stande, eine clientID irgendeines Roboters zu erhalten. Die clientID des Roombas samt Passwort erhielt ich über das Roomba980 Modul.
Über selbiges Modul versuchte ich den Braava zu erreichen, aber das Teil reagiert nicht auf Tastenkombinationen jeglicher Art, um in einen Sende-/Empfangsmodus versetzt zu werden.
Interessant ist folgende Beobachtung in der iRobot-App unter Braava --> Robotereinstellungen --> WLAN Einstellungen --> Details:
Zitat
Netzwerkname
Signalstärke
Sicherheitszyp
IP Adresse
...
...
Verbindungsstatus: Der Roboter kommuniziert mit dem MQTT-Broker
...
Dieses Detail ist im Roomba 980 innerhalb der gleichen App nicht erwähnt.
Während ich dies schreibe habe ich folgendes auf meinem raspberry gemacht:
git clone https://github.com/koalazak/dorita980.git
cd dorita980
npm install
npm run getpassword 192.168.178.51
Make sure your Roomba is on the Home Base and powered on. Then press and hold the HOME button on your roomba until it plays a series of tones (about 2 seconds). Release the button and your Roomba will flash WIFI light. Then wait...
========>
Good job!
Ich habe den Braava Homebutton ca 5 Sekunden gedrückt, dann gab es ähnlich dem Roomba einen Ton und in der Konsole:
Zitat
(node:10977) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
Robot Data:
{ ver: '3',
hostname: 'iRobot-54F4**********0F9',
robotname: 'Braava jet',
robotid: '54F***********F9',
ip: '192.168.178.51',
mac: '50:******F:D8',
sw: 'sanmarino+3.10.8+sanmarino-release-rt320+11',
sku: 'm613440',
nc: 0,
proto: 'mqtt',
cap:
{ edge: 0,
maps: 3,
pmaps: 4,
tHold: 1,
tLine: 2,
area: 1,
eco: 1,
multiPass: 2,
pose: 1,
team: 1,
pp: 0,
'5ghz': 1,
prov: 3,
sched: 1,
svcConf: 1,
ota: 2,
log: 2,
tileScan: 1 },
blid: '54F************0F9' }
Password=> :1:16*********KgnT <= Yes, all this string.
Use this credentials in dorita980 lib :)
8)
Copy & Paste Deiner Setlist in Teilen:
start:noArg cmd {"command": "start", "time": 1, "initiator": "localApp"}
stop:noArg cmd {"command": "stop", "time": 1, "initiator": "localApp"}
dock:noArg cmd {"command": "dock", "time": 1, "initiator": "localApp"}
resume:noArg cmd {"command": "resume", "time": 1, "initiator": "localApp"}
pause:noArg cmd {"command": "pause", "time": 1, "initiator": "localApp"}
funktioniert aus FHEM heraus super.
Guten Morgen zusammen,
mir fällt auf, dass meine Geräte - wenn MQTT2_Client = opened - im Sekundentakt nur auf den folgenden Readings Aktualisierungen erhalten.
Zitatstate_reported_signal_noise -90 2020-10-05 10:12:17
state_reported_signal_rssi -68 2020-10-05 10:12:17
state_reported_signal_snr 22 2020-10-05 10:12:17
während
Zitatstate
unverändert bleibt. Dort ändert sich das Reading nur beim senden eines Befehlts aus FHEM heraus.
Wenn ich die Roboter per App steuere, kriegt FHEM davon derzeit nichts mit ?
Richtig. Es scheint keine Möglichkeit zu geben, die gegenwärtigen Settings aktiv abzufragen. Und weil der Roboter den FHEM Client nicht aufwecken kann, habe ich mit einem kleinen separaten DOIF dafür gesorgt, dass (nur tagsüber und wenn nicht sowieso connected) alle 5 Minuten ein automatischer Connect von FHEM mit dem Roboter gemacht wird. Also spätestens nach 5 Minuten bekommt FHEM das mit - und erhält dann auch regelmäßig die Positionsdaten und die Netzwerkdaten.
Und ja: Ich finde das mit dem sekündlich aktualisierten RSSi auch grenzwertig, habe es darum bis auf ein Reading auch unterdrückt. Aber das ist nunmal der Kram, der vom Roboter kommt - verhindern kann man den wohl eher nicht.
LG
pah
Hallo,
du könntest aber mit der Rssi und deinen Karten hervorragend eine Karte zur Netzabdeckung erzeugen.
Man müsste ,,nur" den Fahrweg abhängig von rssi einfärben.
Quasi Roomba zum WLan ausleuchten....eigentlich genial, um tote Ecken zu finden / Accesspoints zu positionieren.
Ich glaube ich lass Robi mal bei meinen Problemkunden putzen 😬
Gruß
Andreas
Kleiner Hinweis: mit "periodicCmd" kann auch MQTT2_DEVICE in eingeschränktem Umfang Timer verwalten. Müßte also ggf. gehen, (notfalls mit etwas "Tricksen", da kann ja auch ein Perl-Kommando als setter/getter stehen) ohne ein betreffendes externes Device auszukommen ;) .
(Beispielsweise verwirft OpenMQTTGateway_BT_scanner immer nach 24h alle "gesammelten Werke"):
attr DEVICE setList\
[...]\
deleteReadings:noArg {fhem "deletereading -q $NAME (?!associatedWith).*"}
attr DEVICE periodicCmd deleteReadings:1440
Zitat von: Prof. Dr. Peter Henning am 05 Oktober 2020, 11:26:50
Richtig. Es scheint keine Möglichkeit zu geben, die gegenwärtigen Settings aktiv abzufragen. Und weil der Roboter den FHEM Client nicht aufwecken kann, habe ich mit einem kleinen separaten DOIF dafür gesorgt, dass (nur tagsüber und wenn nicht sowieso connected) alle 5 Minuten ein automatischer Connect von FHEM mit dem Roboter gemacht wird. Also spätestens nach 5 Minuten bekommt FHEM das mit - und erhält dann auch regelmäßig die Positionsdaten und die Netzwerkdaten.
Und ja: Ich finde das mit dem sekündlich aktualisierten RSSi auch grenzwertig, habe es darum bis auf ein Reading auch unterdrückt. Aber das ist nunmal der Kram, der vom Roboter kommt - verhindern kann man den wohl eher nicht.
LG
pah
Du hast in Deinem Listung von Seite 1 dieses Threads immerhin (u.a. )
Zitat2020-09-13 12:44:52 state Charging
dort stehen, das müsste imho eine Statusinfo von Deinem Roboter sein, oder nicht?
D.h. zum Zeitpunkt des Connects durch den MQTT2_Client befand sich der Roboter im Dock und war am aufladen.
Deine Workarounds bzgl. zyklischer Verbindungen habe ich gesehen.
Bei mir ändert sich
state jedoch nie. Egal, ob der Robi im Dock steht oder gerade fährt, es steht in diesem Reading bei mir immer der zuletzt aus FHEM gesandte Befehl mit Timestamp wann er versendet wurde. Die anderen Readings bzgl. Netzwerk etc. aktualisieren sich brav 1malig bei Connect.
Hmmm. Katastrophal: gestern abend noch problemlos einen Lauf eines der Roboter gestartet, heute morgen ging gar nichts mehr. Das MQTT2_CLIENT bekommt keine Verbindung mehr zu einem der beiden Roboter, auch ein manueller Connect-Befehl bewirkt GAR NICHTS. verbose=5 liefert nur in kurzen Abständen
Zitat020.10.07 12:28:37 5: HttpUtils url=https://192.168.0.xx:8883/
2020.10.07 12:28:37 4: IP: 192.168.0.xx -> 192.168.0.xx
2020.10.07 12:28:46 5: HttpUtils url=https://192.168.0.xx:8883/
2020.10.07 12:28:46 4: IP: 192.168.0.xx -> 192.168.0.xx
Keine Fehlermeldung, kein Rückgabewert, kein nix. Auch keine Response der Roboter.
Steuerung per App geht noch.
Edit: Problem behoben - aber Ursache noch nicht klar. Das Einzige, was tatsächlich Abhilfe schaffte, war ein Hardware-Reset beider Roboter durch kurzen Ausbau des Akkus. Die beiden waren übrigens auch nicht mehr durch die Python-Anwendung Roomba980 erreichbar, ebensowenig durch die JavaScript-Anwendung dorita980. Was kann der Grund sein? Ich habe seit gestern von FHEM aus einen regemäßigen manuellen Connect vorgenommen - aber kein Kommando gesendet. Aus dem Bauch heraus: möglicherweise speichert der interne MQTT-Broker der Roboter die IP-Adresse, von der aus die Connects ohne Daten kommen, in einer Blacklist und nimmt davon nichts mehr entgegen. Oder ein Puffer läuft voll. Oder die Kiste ist in einer Endlosschleife und wartet auf Daten aus der Quelle.
Der langen Rede kurzer Sinn: Vielleicht könnte einer der anderen Interessenten mal versuchen, das Problem nachzustellen: Tagsüber alle 5 Min einen automatischen Connect, und das mal eine Weile laufen lassen. Und schauen, ob der Roboter nach einem Tag noch erreichbar ist.
LG
pah
ZitatKeine Fehlermeldung, kein Rückgabewert, kein nix. Auch keine Response der Roboter.
Hypothese: TCP Verbindungsaufbau samt TLS Handshake ist durchgelaufen, der MQTT Server hat aber nicht auf die MQTT CONNECT Nachricht reagiert.
Ich habe jetzt MQTT2_CLIENT angepasst, damit der Timer in diesem Fall auch zuschlaegt, und eine Meldung produziert.
Update:
1. Schwäche der bisherigen Installation: Wenn die Kiste steckenbleibt, geht der Client natürlich nach dem eingestellten timeout auf disconnected. Das ist übel, weil man ja selten innerhalb von 5 Sekunden die Ursache beheben kann. Nötig ist also ein zyklisches connect, damit man das Weiterfahren dann nicht verpasst.
2. Bei den Karten mache ich derzeit aus Zeitmangel nur geringe Fortschritte. Als erfolgversprechend hat sich Folgendes herausgestellt:
a. Einmalig: Bestimmung der konvexen Hülle des maximalen Saugbereiches aus einem Plan der Wohnung, sowie des entsprechenden Schwerpunktes (Zentroid).
b. Nach jedem Lauf: Bestimmung der konvexen Hülle des abgesaugten Bereiches, sowie dessen Zentroid.
c. Abgleich von b. mit den Daten aus a. liefert die notwendige Transformation, um den abgesaugten Koordinatenbereich genau in den Plan der Wohnung einzupassen.
LG
pah
Hallo,
habe gestern mal mein Glück versucht an einem i7
Robot Data:
{ ver: '3',
hostname: 'iRobot-XXXX',
robotname: 'Putzfee',
robotid: ''XXXX,
ip: '192.168.X.X,
mac: 'XXXX',
sw: 'lewis+3.10.8+lewis-release-rt320+13',
sku: 'i755640',
nc: 0,
proto: 'mqtt',
cap:
{ binFullDetect: 1,
dockComm: 1,
wDevLoc: 2,
bleDevLoc: 1,
edge: 0,
maps: 3,
pmaps: 4,
tLine: 2,
area: 1,
eco: 1,
multiPass: 2,
pose: 1,
team: 1,
pp: 0,
'5ghz': 1,
prov: 3,
sched: 1,
svcConf: 1,
ota: 2,
log: 2,
tileScan: 1 },
blid: 'XXXX' }
Password=> XXXX <= Yes, all this string.
Use this credentials in dorita980 lib :)
Passwort und ID auslesen ging. Leider verbindet der MQTT-client nicht.
Internals:
BUF
CFGFN
DEF 192.168.X.X:8883
DeviceName 192.168.X.X:8883
FUUID 5f7c2c61-f33f-9eb9-e80b-2411f9c9f72d0af4
NAME PutzfeeClient
NEXT_OPEN 1603103254.02846
NR 925
PARTIAL
SSL 1
STATE disconnected
TYPE MQTT2_CLIENT
WBCallback
clientId blid
connecting 1
lastMsgTime 1603096483.99491
nextOpenDelay 5
READINGS:
2020-10-19 12:27:29 state disconnected
powerMap:
readingsDesc:
energy:
rtype whr
power:
rtype w
sslargs:
SSL_version SSLv23
Attributes:
SSL 1
autocreate simple
clientId blid
room MQTT2_DEVICE
sslargs SSL_version:SSLv23
username blid
verbose 5
ist bei attr Username und ClientID jeweils die blid einzutragen?
Password habe ich über set gesetzt.
Jemand noch einen Tip für mich?
Gruß
Eisix
Noch das Log
2020.10.19 16:41:18.247 5: PutzfeeClient: sending CONNECT (16)p(0)(6)MQIsdp(3)(194)(0)(30)(0) blid(0) blid(0)(30)PWD
2020.10.19 16:41:18.248 5: SW: XXXX
2020.10.19 16:41:18.251 1: 192.168.X.X:8883 reappeared (PutzfeeClient)
2020.10.19 16:41:18.257 3: Opening PutzfeeClient device 192.168.X.X:8883
2020.10.19 16:41:18.257 5: HttpUtils url=https://192.168.X.X:8883/
2020.10.19 16:41:18.257 4: IP: 192.168.X.X -> 192.168.X.X
2020.10.19 16:41:18.262 4: HttpUtils: 192.168.X.X: Connection reset by peer (104)
2020.10.19 16:41:18.433 1: 192.168.X.X:8883 disconnected, waiting to reappear (PutzfeeClient)
2020.10.19 16:41:18.449 5: HttpUtils url=https://192.168.X.X:8883/
2020.10.19 16:41:18.450 4: IP: 192.168.X.X -> 192.168.X.X
2020.10.19 16:41:18.455 4: HttpUtils: 192.168.X.X: Connection refused (111)
Zitatist bei attr Username und ClientID jeweils die blid einzutragen?
So hab ich es gemacht, ja.
Ist die SSl-Version richtig gesetzt?
LG
pah
Hallo,
username und clientid = blid - keine Leerzeichen?
Password ohne Leerzeichen?
IP richtig?
Aktuelle Firmware mit der APP geflusht?
SSL Passt so mit 23.
Eventuell mal Port 1883 probieren.
Gruß Andreas
Hallo,
sslargs SSL_version:SSLv23
blid: 'X'
sollte dann das X sein
Password=> X <= Yes
hier auch das X
IP ist richtig, letzte Firmware ist drauf
Port 1883 habe ich probiert hat nicht funktioniert, aber ich denke 8883 ist richtig sieht man auch am log "Opening PutzfeeClient"
telnet 192.168.X.X 8883
Trying 192.168.X.X...
Connected to 192.168.X.X.
Escape character is '^]'.
Gruß
Eisix
Hallo,
welche Version von openssl ist auf dem Server?
Gruß Andreas
openssl version
OpenSSL 1.1.1f 31 Mar 2020
Zitatblid: 'X'
sollte dann das X sein
Password=> X <= Yes
hier auch das X
Nein. Das Passwort ist ein deutlich längerer String, etwa in der Form
Roomba (Feger) IP address is: 192.168.0.zz
blid is: 3112345678900
Password=> :1:112345670:g698ehf9j0306A <= Yes, all this string.
LG
pah
Hallo pah,
Ich war sehr sparsam mit den den X'en :o
Also sind alle drei durch : getrennte Felder das Passwort oder nur das letzte?
Das erste Feld :1 ist bei allen gleich
Das zweite Feld :112345670 ist der Unix timestamp der Passworterzeugung
Das dritte ist das eigentliche Passwort
Habe schon alles und das dritte Feld ohne Erfolg probiert.
Gruß
Eisix
Bei meinen Robotern musste ich den ganzen String eintragen.
Hast Du die Verbindungstaste am Roboter gedrückt gehabt?
Funktioniert das mit den einfachen Beispielen unter node.js?
LG
pah
Hi,
siehe https://github.com/NickWaterton/Roomba980-Python/issues/65#issuecomment-568524075
ZitatThe relationship between MQTT and the app is that the app will try to connect to the Roomba locally via MQTT to control it. If it can't connect via MQTT, it falls back to using a remote connection via AWS - you can tell it's done this because the app displays a "globe" icon in the top right corner.
The Roomba only allows one connection via MQTT. Once the Roomba believes that an MQTT connection has been established, it refuses all other connections.
If you run Roomba980-Python in this case, you get the:
Connection Error [Errno 111] Connection refused
Message.
Even if the app is closed, the Roomba may still believe that the MQTT connection is present. You may have to reset the Roomba, and reconnect WiFi. Hopefully this will clear the MQTT connection.
Once Roomba980-Python successfully connects, you can then connect via the app, and you should get the "globe" icon to show it's connected remotely.
Gruß Andreas
@pah
Welche ist den die Verbindungstaste? Musste bei der Erstinstallation verschiedene Tastenkombinationen drücken.
Gruß
Eisix
Na ja, ich habe ja keinen i7, insofern kann ich das nicht sagen. Aber genau die Taste, die man drücken musste um z.B. das Passwort zubekommen. Bei meinen Kisten ist das die WLAN-Taste länger als 2 Sekunden.
Und wie Sturi2011 schon geschrieben hat: Dabei sollte die App nicht gleichzeitig verbunden sein.
LG
pah
Hallo,
die Verbindungstaste scheint bei mir der Homebutton zu sein.
MQTT2_DEVICE wurde per autocreate angelegt, aber der MQTT-Client kriegt keine dauerhafte Verbindung.
Kann das noch was mit dem eco modus zu tun haben und wie schaltet man den aus?
Gruß
Eisix
Zitatdie Verbindungstaste scheint bei mir der Homebutton zu sein.
So isses auch bei mir.
ZitatMQTT2_DEVICE wurde per autocreate angelegt, aber der MQTT-Client kriegt keine dauerhafte Verbindung.
Soll ja auch nicht - der MQTT2_CLIENT kennt darum die set-Befehle connect/disconnect, und das Attribut disconnectAfter
ZitatKann das noch was mit dem eco modus zu tun haben und wie schaltet man den aus?
ich glaube zu verstehen, was Du meinst. Im EcoCharge-Modus (auszuschalten in der App) stellt der Roboter die Verbindung zum Netz ein. Ich habe noch keine Zeit gehabt zu prüfen, ob sich die Kiste durch ein WOL-Paket oder Ähnliches wieder aufwecken lässt. Also einfach ausschalten.
Gruß
Eisix
Anbei die aktuelle Version meiner 99_RoombaUtils.
Beim Abschluss einer Mission wird jetzt jeweils eine Datei /opt/fhem/<NAME><DATUM>.pl erzeugt, die (im Moment für Weiterverarbeitungszwecke) Perl-Code mit
- Bounding Box
- Gesaugter Fläche
- Konvexer Hülle des Pfades
- Schwerpunkt (Zentroid) der konvexen Hülle
- Pfad, Array mit Richtungswinkeln, Array mit Geschwindigkeiten
enthält.
LG
pah
Hallo,
WOL- Paket muss es geben da die App das Teil aufweckt.
Den EcoCharge Modus kann ich bei mir in der App nicht ausschalten.
Ich kriege von Fhem aus keine Aktionen ausgelöst. Die Verbindung zum MQTT2_CLIENT bricht immer sofort ab.
Hat jemand eine i7 am laufen oder sind das alles 980er.
Gruß
Eisix
Hallo,
habe den Fehler denke ich gefunden
attr PutzfeeClient mqttVersion 3.1.1
hat gefehlt. Ist jetzt auf connected.
Danke und Gruß
Eisix
Hallo,
wie kriege ich am einfachsten einen komplette Übersicht welche Daten das Teil ausspuckt?
Ich hab den i7+, bei mir ist noch die Absaugung in der Station. Die Favoriten würde ich auch noch auslesen wollen da ich ihn hauptsächlich anwesenheitsgesteuert, besser abwesenheitsgesteuert betreiben will.
Gruß
Eisix
Einfach mit dem Standardwert für readingList
Zitat<blid>:.* { json2nameValue($EVENT) }
und autocreate=1 laufen lassen.
LG
pah
mmmh,
irgendwie habe ich den Faden verloren.
Es steht doch noch aus, dass der Status des Gerätes nicht übertragen wird/ oder "wurde".
Im MQTT2_DEVICE "RoombaFegerClient" gibt es aber den
state_reported_cleanMissionStatus_phase
zeigt der nicht genau das an, was ihr sucht?
Ich habe einen i7 mit der FW3.10.8. Heute aktualisiert (30.10.2020)
Wenn man den beim MQTT2_DEVICE "RoombaFeger" in den Status bekommt wäre das nicht die Lösung?
ich habe jetzt noch fürs Auge
attr RoombaFeger stateFormat Status von Annemarie: state_reported_cleanMissionStatus_phase
eingetragen und bekomme den Status des Roboters angezeigt.
und damit schalte ich jetzt das Licht an, wenn er losfährt.
Grüße Stefan
Zitatirgendwie habe ich den Faden verloren.
Sieht so aus. Denn das war nie ein Problem.
Das Problem besteht darin, dass die Kiste sich vom WLAN trennt, wenn sie in den EcoCharge-Modus geht. Ich bin auf Grund vieler anderer Aufgaben noch nicht dazu gekommen, das Aufwecken mit einem WOL-Paket zu probieren. Wenn iRobot sauber arbeiten würde, wäre der Roboter damit aufzuwecken. _Dass_ er irgendwie wieder aufgeweckt werden kann ist klar - denn das macht die App j auch.
LG
pah
Ich habe gerade meine Roomba-Anbindung ins Produktivsystem umgezogen.
Leider bekomme ich jetzt massenhaft
Zitattls_process_ske_dhe:dh key too small
Fehler. Das ist schon bei Anderen aufgetreten, und die empfohlene Lösung war immer, in der Datei /etc/ssl/openssl.conf
ZitatCipherString = DEFAULT@SECLEVEL=2
auszukommentieren oder die 2 durch eine 1 zu ersetzen.
allerdings taucht die Zeile mit CipherString in meiner openssl.conf gar nicht auf - hat jemand noch eine andere Lösung parat?
LG
pah
Hallo,
hast du die neueste OpenSSL?
Lies mal hier quer:
https://stackoverflow.com/questions/36417224/openssl-dh-key-too-small-error
Gruß Andreas
Ja habe ich: 1.1.1f - und stolpere schon seit heute morgen in den ganzen Tipps über das "CipherString", das in meine ropenssl.cnf nicht auftaucht.
LG
pah
Hallo,
hast Du schon mal probiert die Zeile bei Dir einfach einzuttragen ?
LG, Jens
Natürlich - aber es fehlte noch der Hinweis, dass oben in der openssl.cnf die richtige Konfigurationssektion genannt werden muss.
Jetzt tut es. Also Anleitung aus stackoverflow:
ZitatAdding openssl_conf = default_conf at the top of the file
Adding at the end:
[ default_conf ]
ssl_conf = ssl_sect
[ssl_sect]
system_default = ssl_default_sect
[ssl_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=1
LG
pah
Sooo, mit den Karten bin ich ein großes Stück weiter gekommen.
Meine Roboter machen jetzt Folgendes:
- Am Ende jeder Mission sehen sie nach, ob eine SVG_Datei mit dem Grundriss existiert. Wenn ja, wird diese in eine Ausgabedatei kopiert, dann wird geschaut, ob schon vorige Läufe da sind. Wenn ja, werden zunächst diese in die Ausgabedatei kopiert, dabei werden die Farben etwas abgeschwächt. Dann wird der aktuelle Lauf hineinkopiert und die Datei finalisiert. Außerdem wird der aktuelle Lauf auch noch in die Datei der "vorigen Läufe" hinzugefügt.
- Die Ausgabedatei liegt im images-Verzeichnis des FHEMWEB und kann mit dem Browser angesehen werden.
Ein Beispiel findet man anbei - und man muss natürlich ein paar Attribute setzen, siehe Doku ganz unten in der RoombaUtils. Auch werden ein paar Bibliotheken für die Polynomrechnungen benötigt. Fehlen noch in der Dokue, bitt eoben in der RoombaUtils nachsehen.
Es wird noch eine Option hinzukommen, mit der man dann die "alten" Läufe auch herauswerfen kann. Außerdem ist das Setzen einer Drehung noch nicht automatisiert - es kann also sein, dass die Anzeige noch nicht optimal funktioniert, wenn der Roboter nicht nach links = "west" startet.
LG
pah
Hallo Peter,
ich hatte bisher immer den iRobot 960 über das alte Modul am Laufen und mit Einstellungen liegen lassen.
Nun sehe ich, dass es scheinbar eine funktionierende Lösung über MQTT gibt.
Wie aktuell ist denn im moment das Wiki https://wiki.fhem.de/wiki/Roomba um mit der Einrichtung des Roomba zu starten?
Gibt es ggf. ein aktuelleres HowTo oder ist das auf dem neusten Stand?
Danke und Gruß
sTaN
So, ich habe über die Anbindung der Roomba-Roboter einen Wiki-Eintrag geschrieben, das Hilfsmodul 99_RoombaUtils.pm befindet sich ab sofort im FHEM-Ordner contrib/Roomba.
https://wiki.fhem.de/wiki/Roomba
Es gibt in diesem Wiki-Eintrag auch eine noch etwas rudimentäre Beschreibung, wie man die interaktiven Reinigungskarten erzeugt und verwaltet.
In der angehängten Datei kann man das Gesamtergebnis für die Karten sehen - dass da noch ein paar schief ausgerichtete Läufe drin sind, zeigt den noch etwas provisorischen Charakter. Bitte mit der Maus die Liste links berühren.
LG
pah
@sTaN: Heute geschrieben.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 06 Januar 2021, 18:54:15
@sTaN: Heute geschrieben.
LG
pah
Na das nenn ich mal Zufall ;D
Danke, dann werde ich mich da mal dran machen.
Gruß sTaN
Hallo,
super Sache und auch bereits gute Anleitung. Danke!
Habe meinen Roomba E5 (E5158) konfiguriert. Readings kommen rein...
Beim MQTT2_CLIENT habe ich
attr RoombaClient sslargs SSL_version:TLSv1_2
gesetzt. Damit musste ich nichts an openssl.conf ändern.
99_RoombaUtils.pm suche ich noch... FHEM update hat es noch nicht dabei gehabt... :D
Gruß,
Thomas
1. Der contrib-Ordner, in dem die Datei 99_RoombaUtils.pm derzeit steht, wird nicht automatisch upgedated.
Wie man an die Datei herankommt, steht z.B. hier: https://forum.fhem.de/index.php?topic=36012.0
2. Bitte an alle Nutzer dieser MQTT-Anbindung:
Hier einen kurzen Post mit der Bezeichnung des funktionierenden Roboters, z.B. "Roomba i7" oder "Braava xyz"
LG
pah
zu 1. Es geht auch einfacher :)
In der FHEM Kommandozeile ...
{ Svn_GetFile("contrib/Roomba/99_RoombaUtils.pm", "FHEM/99_RoombaUtils.pm") }
Man muss ja wegen einer Datei nicht durch die halbe Welt im ZickZack fliegen. ;)
Du beantwortest dann auch hoffentlich die eher grundlegenden Fragen der Anfänger - etwa "Und wo soll man das eingeben?".
LG
pah
Ich hoffe ich habe keine weiteren banalen Fragen. ;D
Hatte nicht auf dem Schirm das der contrib-Ordner nur einmalig bei der Installation (hatte ich über apt, debian.fhem.de/nightly gemacht) kopiert wird.
Die Kommandos (start, dock, etc.) mit 99_RoombaUtils.pm funktionieren, es fehlen aber noch ein paar Readings...
"stateFormat cmPhaseD (battery %)" wird als "Wird geladen (battery %)" angezeigt.
Das reading "battery" fehlt. Warum konnte ich noch nicht erkennen.
Vorhandene Readings:
cmArea 0 m²
cmCycle clean
cmError None
cmErrorD Kein Fehler
cmExpire Never
cmInitiator localApp
cmMap initialized
cmNotReady false
cmPhase hmUsrDock
cmPhaseD Dockingbefehl
cmPhaseE User Docking
cmTime 0 min
lastCommand dock
lastCommandInitiator localApp
sBinPause false
sCarpetBoost false
sNoAutoPasses false
sNoPP false
sOpenOnly false
sSchedHold false
sTwoPass false
sVacHigh false
signalRSSI -50
state dock
Gruß,
Thomas
Dann gibts nur einen Weg:
Als erste Zeile der readingList eintragen:
attr RoombaFeger readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
Dann die Kiste laufen lassen - die hundert nutzlosen Readings kann man später wieder löschen. irgendeines dieser Readings wird den Ladezustand anzeigen - davon benötige ich die geanue Bezeichnung.
LG
pah
Hallo pah,
das hatte ich zu Anfang gehabt. Da hatte ich "batPct" gesehen.
Habe mir die MQTT Nachricht noch mal ausgeben lassen. Ich denke es klemmt, da "batPct" mit "cleanSchedule" und "cleanMissionStatus" zusammen gesendet wird.
Kann es da sein, das alles vom elsif( $evt =~ /cleanMissionStatus/) "blockiert wird"? Es fehlt ja auch "cleanSchedule", was ebenfalls wie "state....reported....batPct" nach dieser elseif Abfrage kommt.
{"state":{"reported":{"cleanSchedule":{"cycle":["none","none","none","none","none","none","none"],"h":[0,0,0,0,0,0,0],"m":[0,0,0,0,0,0,0]},
"language":15,"cleanMissionStatus":{"cycle":"none","phase":"stop","expireM":0,"expireTm":0,"rechrgM":0,"error":0,"notReady":0,"mssnM":0,"mssnStrtTm":0,"sqft":0,"initiator":"","nMssn":8},
"dock":{"known":true},
"bin":{"present":true,"full":false},
"batPct":100,"mobilityVer":"1086","bootloaderVer":"2.5","soundVer":"14","batteryType":"F12432832R"}}}
Gruß,
Thomas
Wahrscheinlich haben die Herrschaften bei iRobot in dieser Version das API anders antworten lassen.
Abhilfe: Hinter Zeile 464. also hinter
$ret{"cmNotReady"} = numtobool($notr)
if(defined($notr));
bitte einfach einfügen
my $bat = $dec->{'state'}->{'reported'}->{'batPct'};
$ret{"battery"} = $bat
if(defined($bat));
LG
pah
Edit: So wars ja auch gemeint.
Hallo,
Danke für die Tipps/Hilfe.
Ich habe mal "sub reading" etwas verunstaltet, um die passenden MQTT Themen/Daten zu erhalten, egal wie sie strukturiert sind (das ist zumindest die Idee).
Schön ist das (noch) nicht, aber es kommen die bisher Fehlenden readings "battery", "progWeek" an....
sub reading($$){
my ($name,$evt) = @_;
my %ret;
my $sub_ret;
#main::Log 1,"============> $evt";
if( $evt =~ /state....reported....signal/){
$sub_ret = signale($evt);
@ret{ keys %{$sub_ret} } = values %{$sub_ret};
}
if( $evt =~ /state....reported....pose/){
$sub_ret = pose($name,$evt);
@ret{ keys %{$sub_ret} } = values %{$sub_ret};
}
#}elsif( $evt =~ /bbrun/){
# main::Log 1,"[RoombaUtils] bbrun ".$evt;
if( $evt =~ /cleanMissionStatus/){
$sub_ret = mission($name,$evt);
@ret{ keys %{$sub_ret} } = values %{$sub_ret};
}
if( $evt =~ /cleanSchedule/){
#main::Log 1,"[RoombaUtils] schedule event ".$evt;
$sub_ret = schedule($evt);
@ret{ keys %{$sub_ret} } = values %{$sub_ret};
}
if( $evt =~ /(vacHigh)|(openOnly)|(binPause)|(carpetBoost)|(twoPass)|(schedHold)|(lastCommand)/){
$sub_ret = settings($name,$evt);
@ret{ keys %{$sub_ret} } = values %{$sub_ret};
}
#if( $evt =~ /state....reported....batPct/){
if( $evt =~ /batPct/){
$sub_ret = battery($evt);
@ret{ keys %{$sub_ret} } = values %{$sub_ret};
}
if( $evt =~ /state....reported....dock/){
$sub_ret = dock($evt);
@ret{ keys %{$sub_ret} } = values %{$sub_ret};
}
[...snip...]
if (%ret) {
return {%ret};
}else{
my ($evt) = @_;
main::Log 1,"[RoombaUtils] uncaught event ".$evt
if( $evt ne "$name" );
return
}
}
Gruß,
Thomas
Das ist in der Tat etwas verunstaltet und folgt nicht meiner Philosophie.
Erstens dachte ich, dass das mit battery jetzt erledigt sei Und zweitens habe ich bisher nichts davon gehört, dass progWeek auch nicht klappen würde.
LG
pah
Hallo pah,
ja, progWeek wird bei meinem Roomba Modell mit cleanMissionStatus und batPct zusammen geschickt. Beides wurde von elsif( $evt =~ /cleanMissionStatus/) "blockiert". Es gibt noch mehr Abweichungen... die Daten sind alle da, leider nur anders zusammengestellt.
Falls es bei den anderen Modellen ebenfalls etwas unterschiedlich strukturiert ist, wäre es gut die Auswertung der MQTT Daten etwas flexibler zu gestalten. Was sich bestimmt eleganter als in meinem "quick & dirty" Ansatz lösen lässt...
Ich wollte mir noch ein weitere Werte Auslesen (batInfo, mName, mDate; estCap; softwareVer), "estCap"/"bbchg3" ist z.B. bei mir in:
{"state":{"reported":{"bbmssn":{"nMssn":8,"nMssnOK":4,"nMssnF":4,"aMssnM":0,"nMssnC":0,"aCycleM":0},"bbpause":{"pauses":[13,14,0,0,0,0,0,0,0,0]},"bbrstinfo":{"nNavRst":0,"nMobRst":0,"causes":"0000"},"bbpanic":{"panics":[17,14,11,15,11]},"bbchg3":{"nAvail":6,"estCap":2050},"r2a":{"monits":false,"params":{"monitIds":[],"monitPeriodMs":1000,"monitConditions":"8"}}}}}
EDIT: Kann jemand bestätigen, ob "cCount" chargeCount, also Anzahl der Ladevorgänge ist? Als Teil von batInfo wäre das durchaus plausiebel.
$dec->{'state'}->{'reported'}->{'batInfo'}->{'cCount'};
Gruß,
Thomas
Zitat von: Prof. Dr. Peter Henning am 10 September 2020, 16:40:34
Ich habe über die Anbindung der Roomba-Roboter einen Wiki-Eintrag geschrieben, das Hilfsmodul 99_RoombaUtils.pm befindet sich ab sofort im FHEM-Ordner contrib/Roomba.
https://wiki.fhem.de/wiki/Roomba
Es gibt in diesem Wiki-Eintrag auch eine noch etwas rudimentäre Beschreibung, wie man die interaktiven Reinigungskarten erzeugt und verwaltet. [/b]
Hallo zusammen,
Das Wiki ist in Zusammenhang mit etwas Erfahrung und Geduld super geglückt!
Ich würde nicht sagen, dass die Einbindung des roomba 960 ein Durchmarsch war, aber möglich.
Chapeau für Eure detaillierte Forschung zum Thema!
Es ist ein wenig gewöhnungsbedürftig, dass das Gerät von sich aus keine Readings an fhem sendet, wenn es aufgrund des eigenen Zeitplans loseiert. Aber man kann es ja von fhem losschicken lassen...
Allein bei den Reinigungskarten hab' ich noch Probleme. Daher folgende Fragen:
1.) Die IP-Adresse für den Link im Reading cmMap scheint im Coding statisch zu sein?
2.) Die Map-Verwaltung tut bei mir nicht so richtig. Das Löschen alter Einträge mit so etwas wie "set roomba mapdel 1" funktioniert nicht.
3.) Die Zusammenfassung der Karten am Ende der Reinigung legt mein fhem für eine ganze Zeit komplett lahm. Kann man die Kartenfunktion komplett abschalten? Reicht es, dafür das SVG-Template und die userattribs im Device zu löschen?
4.) Lässt sich das Löschen alter Reinigungskarten über das Modul steuern? Wäre da nicht so ein Attribut wie "nur die letzten X Pfade behalten" praktisch?
Danke im Voraus für Euer Hirnschmalz,
FSausF
ZitatDas Wiki ist in Zusammenhang mit etwas Erfahrung und Geduld super geglückt!
Tja. Pädagoge.
Zitat1.) Die IP-Adresse für den Link im Reading cmMap scheint im Coding statisch zu sein?
Oops, das ist noch ein Bug. Werde ich demnächst beheben
Zitat2.) Die Map-Verwaltung tut bei mir nicht so richtig. Das Löschen alter Einträge mit so etwas wie "set roomba mapdel 1" funktioniert nicht.
Damit kann ich nicht viel anfangen.
Zitat3.) Die Zusammenfassung der Karten am Ende der Reinigung legt mein fhem für eine ganze Zeit komplett lahm. Kann man die Kartenfunktion komplett abschalten? Reicht es, dafür das SVG-Template und die userattribs im Device zu löschen?
Es reicht, das Attribut SVG_room zu löschen.
Zitat4.) Lässt sich das Löschen alter Reinigungskarten über das Modul steuern? Wäre da nicht so ein Attribut wie "nur die letzten X Pfade behalten" praktisch?
Erstens: Ja. Ist in Arbeit. Zweitens: Das will ich gar nicht.
LG
pah
Hallo zusammen,
Auch von mir ein großes Lob zu eurer Arbeit.
Bei meinem Roomba 980 hatte ich das Problem, dass er während der SSL-Aushandlung sehr langsam antwortet.
Leider so langsam, dass in HttpUtils der Standard-Timeout zuschlägt und die Verbindung kappt (siehe Bild Wireshark-Trace im Anhang).
Bei mir blieb der Client einfach "disconnected" ohne Fehlermeldung.
Ich habe mir so geholfen, dass ich ein neues Attribut "TIMEOUT" in 00_MQTT2_CLIENT.pm hinzugefügt habe.
Hier der Patch:
--- /opt/fhem/FHEM/00_MQTT2_CLIENT.pm 2021-01-29 11:03:11.661987165 +0100
+++ 00_MQTT2_CLIENT_neu.pm 2021-01-29 11:02:13.092978830 +0100
@@ -51,6 +51,7 @@
subscriptions
SSL
sslargs
+ TIMEOUT
username
);
use warnings 'qw';
@@ -282,6 +283,11 @@
$hash->{SSL} = $param[0] ? $param[0] : 1;
}
+ if($attrName eq "TIMEOUT") {
+ delete($hash->{TIMEOUT});
+ $hash->{TIMEOUT} = $param[0] if($type eq "set");
+ }
+
if($type eq "set" && $attrName eq "ignoreRegexp") {
my $re = join(" ",@param);
return "bad $devName ignoreRegexp: $re" if($re eq "1" || $re =~ m/^\*/);
Und dann noch das TIMEOUT Attribut auf 6 Sekunden gestellt:
attr RoombaFegerClient TIMEOUT 6
Da ich kein Perl-/ FHEM-Experte bin, weiß ich nicht, ob das so OK ist.
Vielleicht könnte man den Patch oder etwas Besseres zu 00_MQTT2_CLIENT.pm hinzufügen.
Auch ich habe die Probleme mit "Maps" wie FSauF.
Habe in die setting-Funktion in 99_RoombUtils.pm in den else-Zweig mal eine zusätzliche Log-Zeile hinter $cmd=... eingefügt.
main::Log 1,"[RoombaUtils] setting: cmd: ".$cmd;
Im Log sieht man dann nach
set RoombaFeger maplist
folgendes:
[RoombaUtils] setting: cmd: delta {"state": {"vacHigh":false}}
Da scheint also noch etwas schief zu gehen.
Hallo pah,
danke auch von meiner Seite.
Ich habe bei mir das Problem, dass beim Verbindungsaugbau eine Fehler kommt.
HttpUtils: https://192.168.4.145:8883/: Can't connect(2) to https://192.168.4.145:8883: SSL wants a read first
Internals:
BUF
CFGFN
DEF 192.168.4.145:8883
DeviceName 192.168.4.145:8883
FUUID 60154f0e-f33f-a152-bf40-7027f4812d986ff8
NAME myRoombaClient
NEXT_OPEN 1612009737.4758
NR 147929
PARTIAL
SSL 1
STATE disconnected
TYPE MQTT2_CLIENT
clientId 8...0
connecting 1
nextOpenDelay 5
READINGS:
2021-01-30 13:28:52 state disconnected
sslargs:
SSL_version SSLv23
Attributes:
SSL 1
autocreate simple
clientId 8...0
mqttVersion 3.1.1
room Roomba
sslargs SSL_version:SSLv23
username 8...0
verbose 5
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=1
Einer eine Idee was das sein könnte
Danke schon mal
Gruß
Michael
ZitatDa scheint also noch etwas schief zu gehen.
Nö, das ist vorerst (!) so beabsichtigt.
@MichaelT: https://forum.fhem.de/index.php?topic=43794.0
LG
pah
Zitat von: Prof. Dr. Peter Henning am 30 Januar 2021, 14:22:41
@MichaelT: https://forum.fhem.de/index.php?topic=43794.0
Danke pah,
Hinweis war gut. Habe nun das Timeout von knorxi, dann geht's.
Schönes WE
Michael
Hallo zusammen,
für mich ist die Reinigung einzelner Räume der häufigste Anwendungsfall. Ein reines "Start" führe ich eigentlich nie aus.
Ich besitze einen Roomba i7, Firmware 3.12.
Folgende Ergänzungen habe ich dafür gemacht:
# in 99_RoombaUtils.pm
my %rooms = ("Kueche" => {'regionId' => 7, 'type' => 'rid'},
"Wohnzimmer" => {'regionId' => 5, 'type' => 'rid'});
# nach sub command eine neue Methode 'cleanRoom' einfügen
sub cleanRoom($$$$) {
my ($name,$pmapId,$userPmapvId,$evt) = @_;
my $hash = $main::defs{$name};
my @dings = split(' ',$evt);
my $roomName = $dings[1];
my $regionId = $rooms{$roomName}{'regionId'};
my $regionType = $rooms{$roomName}{'type'};
my $cmd = 'cmd {"command": "start", "pmap_id": "'.$pmapId.'", "regions": [{"region_id": "'.$regionId.'", "type": "'.$regionType.'"}], "user_pmapv_id": "'.$userPmapvId.'", "time": '.time().', "initiator": "localApp"}';
return $cmd;
}
Das setList im MQTT-Device um folgenden Eintrag ergänzen:
cleanRoom:Kueche,Wohnzimmer {roomba::cleanRoom($NAME,"5xxxxxxxxxxxxxxxxxxxxw","2xxxxxxxxxxx4",$EVENT)}
Der Parameter 5xxxxxxxxxxxxxxxxxxxxw kommt aus dem Reading state_reported_lastCommand_pmap_id
Der Parameter 2xxxxxxxxxxx4 kommt aus dem Reading state_reported_lastCommand_user_pmapv_id
ID und Type für einen Raum bekommt man, indem man in der App den Reinigungsbefehl für einen Raum ausführt.
Die richtigen Werte sind dann in den Readings state_reported_lastCommand_regions_1_region_id und state_reported_lastCommand_regions_1_type ersichtlich.
Wenn man in der App mehrere Räume zur Reinigung auswählt, gibt es entsprechende weitere Readings (..._regions_2_region_...).
Möchte man mehrere Etagen reinigen, empfehle ich, mehrere 'cleanRoom' Befehle in setList anzulegen. Die Etage definiert sich über pmap_id und user_pmapv_id.
cleanErdgeschoss:Kueche,Wohnzimmer {roomba::cleanRoom($NAME,"5xxxxxxxxxxxxxxxxxxxxw","2xxxxxxxxxxx4",$EVENT)}
cleanObergeschoss:Badezimmer,Schlafzimmer{roomba::cleanRoom($NAME,"anderePmapId","andereUserPmapvId",$EVENT)}
Ich hatte selber noch nicht die Zeit dazu, das umzusetzen, werde es aber bei Gelegenheit nachreichen. Ebenso das gleichzeitige Ausführen für mehrere Räume.
Es sollte übrigens für alle Geräte, die Einzelraumreinigung unterstützen (zB auch Braava Jet m6) funktionieren, das konnte ich aber noch nicht verifizieren.
Ich weiß auch nicht, wie lange pmapId und user_pmapv_id stabil sind, bislang funktionieren die Werte, die ich einmalig hinterlegt habe.
Feedback welcome
schöne Grüße
Martin
Ich bin da jetzt voll aus der Kurve geflogen...
Für ein Paar Tage ging alles prächtig: FHEM hat den Roomba losgeschickt, nach gegebenenfalls manueller Aktualisierung des Devices die Reinigungskarte angezeigt, und gut.
Heute dann das Ende: Der Roomba wurde von fhem losgeschickt und hat seine Runde beendet.
Die Reinigungskarte wurde jedoch
nicht fortgeschrieben. Seitdem er in seine Basis zurückgekehrt ist, spricht er nicht mehr mit fhem.
Mit der Roomba-App schon.
Ein Neustart von fhem bringt nix, auch nicht auf Debian-Ebene (PI).
Das MQTT-Device sagt auf Geschwätzigkeitslevel 5:
Zitat2021.02.02 21:37:42 5: HttpUtils url=https://192.168.RICHTIG.RICHTIG:8883/
2021.02.02 21:37:42 4: IP: 192.168.RICHTIG.RICHTIG -> 192.168.RICHTIG.RICHTIG
2021.02.02 21:37:42 5: HttpUtils url=https://192.168.RICHTIG.RICHTIG:8883/
2021.02.02 21:37:42 4: IP: 192.168.2.47 -> 192.168.RICHTIG.RICHTIG
Es sieht mir so aus, als scheitert das auf unterster Protokoll-Ebene.
Erinnere ich mich an den Wiki-Eintrag und führe auf Debian
Zitatpython3 roomba-gettpassword
aus, kriege ich so etwas wie ein Lebenszeichen, das dann aber mir einem Timeout endet:
ZitatReceived: {
"hostname": "Roomba-3192C22492019700",
"nc": 0,
"ip": "192.168.RICHTIG.RICHTIG",
"ver": "3",
"robotname": "Heinzelmann",
"sw": "v2.4.6-3",
"sku": "R960040",
"proto": "mqtt",
"mac": "RICHTIG",
"cap": {
"pose": 1,
"edge": 1,
"eco": 1,
"langOta": 1,
"svcConf": 1,
"multiPass": 2,
"pp": 1,
"binFullDetect": 1,
"ota": 2,
"maps": 1
}
}
Roomba (Heinzelmann) IP address is: 192.168.RICHTIG.RICHTIG
Connection Error timed out
Traceback (most recent call last):
File "roomba-getpassword", line 11, in <module>
load_entry_point('Roomba980-Python==1.2.3', 'console_scripts', 'roomba-getpassword')()
File "/home/pi/.local/lib/python3.5/site-packages/roomba/getpassword.py", line 34, in main
Password(file=arg.configfile)
File "/home/pi/.local/lib/python3.5/site-packages/roomba/password.py", line 41, in __init__
self.get_password()
File "/home/pi/.local/lib/python3.5/site-packages/roomba/password.py", line 138, in get_password
wrappedSocket.send(packet)
File "/usr/lib/python3.5/ssl.py", line 871, in send
return socket.send(self, data, flags)
socket.timeout: timed out
In meiner /etc/ssl/openssl.cnf habe ich am Ende die vermeintlich magischen Zeilen zu SSL-Problemen eingefügt, aber das rockt es nach einem Neustart leider nicht:
Zitat[ssl_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=1
Warum spricht das Aas seit dem Docken nicht mehr mit fhem und wie locke ich ihn aus der Reserve?
Ideen?
Ist mir auch schon passiert, die Ursache ist noch nicht ganz klar.
Abhilfe: Für 10 Sekunden die Batterie des Roomba ausbauen. Danach sollte es wieder gehen.
LG
pah
Hier noch das geplante Update zum Saugen einzelner Räume, mehreren Etagen, und auch mehreren Räumen.
Die IDs werden jetzt direkt in 99_RoombaUtils hinterlegt.
Das macht das setList schlanker. Nachteil: dafür muss man bei einer Änderung RoombaUtils neu laden.
Frage an die Runde: Geht das eigentlich zur Laufzeit? Oder muss ein komplettes shutdown restart gemacht werden?
my %rooms = ("EG" => {"__settings" => {"pMapId" => "5xxxxxxxxxxxxxxxxxxxxw", "userPmapvId" => "2xxxxxxxxxxxxxx4"},
"Kueche" => {"regionId" => 7, "type" => "rid"},
"Esszimmer" => {"regionId" => 1, "type" => "rid"},
"Eingangsbereich" => {"regionId" => 2, "type" => "rid"},
"WC_EG" => {"regionId" => 4, "type" => "rid"},
"Abstellraum" => {"regionId" => 6, "type" => "rid"},
"Wohnzimmer" => {"regionId" => 5, "type" => "rid"}
},
"OG" => {"__settings" => {"pMapId" => "Hxxxxxxxxxxxxxxxxxxxxg", "userPmapvId" => "2xxxxxxxxxx4"},
"Buero" => {"regionId" => 1, "type" => "rid"},
"Flur" => {"regionId" => 5, "type" => "rid"},
"Schrank" => {"regionId" => 10, "type" => "rid"},
"WC_OG" => {"regionId" => 20, "type" => "rid"},
"Lounge" => {"regionId" => 22, "type" => "rid"},
"Schlafzimmer" => {"regionId" => 23, "type" => "rid"},
"Badezimmer" => {"regionId" => 24, "type" => "rid"}
},
"KG" => {"__settings" => {"pMapId" => "6xxxxxxxxxxxxxxxxxxxxA", "userPmapvId" => "2xxxxxxxxxx9"},
"Studio" => {"regionId" => 1, "type" => "rid"},
"Rumpelkammer" => {"regionId" => 2, "type" => "rid"},
"Flur" => {"regionId" => 3, "type" => "rid"}
});
Die Methode cleanRoom ändert sich in folgender Weise.
sub cleanRoom($$$) {
my ($name,$levelName,$evt) = @_;
my $hash = $main::defs{$name};
my @evts = split(' ',$evt);
my $pmapId = $rooms{$levelName}{__settings}{pMapId};
my $userPmapvId = $rooms{$levelName}{__settings}{userPmapvId};
my $regionString = '"regions": [';
my $nrRegions = @evts;
for(my $regIdx = 1; $regIdx < $nrRegions; $regIdx++){
my $regionName = $evts[$regIdx];
my $regionId = $rooms{$levelName}{$regionName}{regionId};
my $regionType = $rooms{$levelName}{$regionName}{type};
$regionString = $regionString.'{"region_id": "'.$regionId.'", "type": "'.$regionType.'"}';
if ($regIdx +1 < $nrRegions) {
$regionString = $regionString.',';
}
}
$regionString = $regionString.']';
my $cmdString = '{"command": "start", "pmap_id": "'.$pmapId.'", '.$regionString.', "user_pmapv_id": "'.$userPmapvId.'", "ordered": 1, "time": '.time().', "initiator": "localApp"}';
# main::Log 1,"============>cleanRoom: $cmdString";
my $cmd = 'cmd '.$cmdString;
return $cmd;
}
Entsprechend ändert sich auch setList
cleanBasement:Rumpelkammer,Studio,Flur {roomba::cleanRoom($NAME,"KG",$EVENT)}
cleanGroundfloor:Kueche,Wohnzimmer,Esszimmer,Eingangsbereich,WC_EG,Abstellraum {roomba::cleanRoom($NAME,"EG",$EVENT)}
cleanUpperfloor:Buero,Flur,Schrank,WC_OG,Lounge,Schlafzimmer,Badezimmer {roomba::cleanRoom($NAME,"OG",$EVENT)}
Damit ist jetzt auch das Reinigen mehrerer Räume möglich. Zum Beispiel
set iRobotRoomba cleanGroundfloor Kueche Esszimmer Wohnzimmer
Die Reihenfolge der Reinigung entspricht der Reihenfolge, wie die Räume angegeben werden. Wer das nicht möchte, kann in cleanRoom das Attribut "ordered":1 wegnehmen.
Ich würd mich sehr freuen, wenn diese Funktionalität es ins contrib schafft. Meine Perl-Syntax ist stark verbesserungswürdig, aber so ist das nun mal mit diesen Java-Entwicklern ;-)
Verbesserungsvorschläge zum Coding-Style nehme ich gern an.
Grundsätzlich werde ich wohl noch daran tüfteln, zb die IDs als Attribute zu hinterlegen, anstatt direkt im Utils, um etwas flexibler auf Änderungen reagieren zu können. Ideal wäre, den gesamten rooms-Hash (oder den Großteil daraus) direkt ins FHEM-UI zu bekommen.
schöne Grüße
Martin
Zitat von: Prof. Dr. Peter Henning am 03 Februar 2021, 08:05:18
Ist mir auch schon passiert, die Ursache ist noch nicht ganz klar.
Abhilfe: Für 10 Sekunden die Batterie des Roomba ausbauen. Danach sollte es wieder gehen.
Ich glaube, hier gibt es eine noch kürzere Lösung als den Ausbau der Batterie - zumindest hat das bei mir gerockt:
Neustart des Roboters, und zwar so:
https://homesupport.irobot.com/app/answers/detail/a_id/10881/~/neustart-oder-reset-des-roboters
Was mir auffiel ist Folgendes:
Ich habe den Roboter sowohl gestern als auch heute dann mit der App auf Reisen geschickt. Dabei konnte er auch für die App keine Karte erzeugen. Also hat er für sich schon einen Knoten im Hirn. Kann wohl auch bei KI passieren.
Ich habe folgenden Verdacht:
Wenn ich es richtig verstehe, wird die Vektor-Karte in fhem erzeugt, wenn der Roboter dockt.
Kann das sein, dass der Zustand dann unsicher wird, wenn während der Berechnung der MQTT-Timeout zuschlägt und auf einer Seite der Leitung noch was unbestätigt in der Queue hängt?
Und, dass dann vonseiten fhem der Reinigungsauftrag protokollarisch nicht so richtig als abgeschlossen vermerkt wird? Oder auf Seite des Roboters?
Wie wäre es, während der Kartenberechnung so etwas wie einen keepalive einzubauen?
Ich bin nach dem Reset fürs erste wieder häppi, werde die Kartenerzeugung abklemmen und mal schauen, ob das Ding dann länger als drei Tage stabil integriert durchhält. Ich werde berichten.
Wenn ich meine laienhaften Finger in den Dienst der weiteren Forschung stellen kann, lass' es mich bitte wissen!
OK, das mit dem Neustart an der clean-Taste werde ich gerne mal probieren. Ich habe eine neue Version des Hilfsmoduls, die ich hier mal anhänge. Sie setzt während des Reinigungsvorgangs das disconnectAfter-Attribut hoch, funktioniert bei mir über die letzte Woche hinweg sehr gut.
LG
pah
So, neuer Tag, neues Glück:
Gestern Abend die neue RoombaUtils eingespielt und die Attribute für die Kartenausgabe wieder gesetzt, um die Feldforschung auf eigener Krume zu unterstützen.
Ergebnis:
- Heinzelmann rumpelt auf fhem-Kommando los. Schon mal gut.
- Nach dem Docken ist der letzte Status "Aufgabe beendet, wird geladen.". Die Readings für Karte und Kartenliste werden nicht automatisch aktualisiert.
- Mit ein, zwei Mal anschubsen (aktualisieren der Anzeige) wechselt der Status auf "wird geladen" und das Reading für die Karte kommt. Danke für die Sache mit der IP-Adresse.
- Die Karte (frisch angefangen) sieht gut aus. Das Reading für die Kartenliste fehlt, und kommt auch nicht, wenn ich es via Maplist anfordere.
Also nur teilweise erfolgreich.
Ich lasse das Mapping noch mal ein Paar Tage mitlaufen und schaue, ob es sich irgendwie eingroovt.
Aber die wesentliche Funktion (Roomba reagiert auf fhem und bollert los) ist zunächst mal gegeben.
Ich berichte über die Stabilität.
P.S.: Hatte ich eigentlich erwähnt, dass mein Roomba-Täterä ein einfacher 960er mit aktueller Firmware ist, keine hochgezüchtete i-Series?
Das sind leider unzureichende Informationen.
- Wie sind die Attributwerte für das Mapping?
- Was sagt das Log dazu?
- Was ist der Wert des Readings cmMap?
Evtl. mal probieren, in der FHEM-Kommadozeile einzugeben
{roomba::finalizemap($defs{"<hier Devicename>"})}
LG
pah
Hallo,
das Modul läuft soweit zu meiner vollsten Zufriedenheit.
Super timing, dass hier genau dann damit begonnen wurde, als ich mir das Teil gekauft hab :-)
Ich hab versucht, bei meinem i7 das Mapping zu nutzen.
Bisher sind durch set maplist keine dafür spezifischen Readings (cmMap?) aufgetaucht.
Auch im Log ist darauf keine Reaktion zu sehen.
Entweder ich mach was falsch, oder der i7 benötigt etwas extra. Firmware ist 3.12.x
Beim Ausführen von
{roomba::finalizemap($defs{"iRobotRoomba"})}
kommt im Log
2021.02.05 10:20:06 1: [RoombaUtils] Finalization of map for device iRobotRoomba not possible, path undefined
Welcher path ist denn damit gemeint?
Das sind die Attribute, die ich am MQTT-Device gesetzt hab:
attr iRobotRoomba LOG_dir /tmp
attr iRobotRoomba SVG_collect SVG_Roomba.xml
attr iRobotRoomba SVG_color1 green:lightgreen
attr iRobotRoomba SVG_color2 orange:yellow
attr iRobotRoomba SVG_color3 red:pink
attr iRobotRoomba SVG_color4 blue:lightblue.
attr iRobotRoomba SVG_final SVG_Roomba.svg
attr iRobotRoomba SVG_room SVG_EG.svg
Mein Anliegen ist eindeutig als low-prio zu deklarieren, ich bin gern bereit, hier aktiv mitzuhelfen.
Danke
schöne Grüße
Martin
Der Pfad ist das Array, in welchem die Punkte einer Mission aufgesammelt werden.
OK, fragen wir mal die Details ab.
1. Werden während einer Reinigungsmission regelmäßig die Readings
Zitatposition
positionCount
positionTheta
upgedated?
2. Was ergibt der Befehl
{Dumper($defs{'<hier Devicename>'}->{helper})}
Vor, während und nach einer Reinigungsmission?
2.
Was steht in den Dateien
ZitatSVG_Roomba.xml
SVG_EG.svg
Das mit dem Reinigen einzelner Räume werde ich irgendwann einbauen - und hoffe, meine beiden Roboter auch dazu zu bewegen. Prinzipiell sollte es möglich sein, per API die Kiste an einen bestimmten Ort zu bewegen und die virtuelle Raumbegrenzung in FHEM einzubauen.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 05 Februar 2021, 14:33:54
1. Werden während einer Reinigungsmission regelmäßig die Readingsupgedated?
Grundsätzlich ja. Bei mir sind das aber
state_reported_pose_point_x
state_reported_pose_point_y
state_reported_pose_theta
Und ich denke, da liegt auch schon die Ursache des Problems.
Ich bin so frei und schau mir mal selber den Code soweit durch, dass ich vielleicht selber etwas experimentiere, bevor ich mehr deiner Zeit beanspruche
Zitat von: Prof. Dr. Peter Henning am 05 Februar 2021, 14:33:54
2. Was ergibt der Befehl
{Dumper($defs{'<hier Devicename>'}->{helper})}
Vor, während und nach einer Reinigungsmission?
Undef
Zitat von: Prof. Dr. Peter Henning am 05 Februar 2021, 14:33:54
Was steht in den Dateien
Nix. Wahrscheinlich ein Folgefehler der vorigen zwei Fragen.
Danke, ich geb Bescheid, wenn ich entweder was Lösen konnte, oder feststecke.
state_reported_pose_point_x
state_reported_pose_point_y
state_reported_pose_theta
Kann eigentlich nur vorkommen, wenn die readingList nicht richtig gesetzt wird. Sonst würde das durch das Unterprogramm pose() abgefangen.
sub pose($$){
my ($name,$evt) = @_;
my $hash = $main::defs{$name};
#-- getting events of the type
# {"state":{"reported":{"pose":{"theta":0,"point":{"x":311,"y":-21}}}}} <============== Hier ein Beispiel für den JSON-Code, der hiermit abgefangen wird
my $dec = decode_json($evt);
my $theta = $dec->{'state'}->{'reported'}->{'pose'}->{'theta'};
my $px = $dec->{'state'}->{'reported'}->{'pose'}->{'point'}->{'x'};
my $py = $dec->{'state'}->{'reported'}->{'pose'}->{'point'}->{'y'};
if($hash->{helper}{initmap}==1){
$hash->{helper}{startx} = $px;
$hash->{helper}{starty} = $py;
$hash->{helper}{initmap}=0;
}
$px -= $hash->{helper}{startx};
$py -= $hash->{helper}{starty};
my $dir = main::AttrVal($name,"startdir","north");
my ($pxp,$pyp);
if($dir eq "north"){
$pxp = -$py;
$pyp = $px;
}elsif($dir eq "east"){
$pxp = $px;
$pyp = $py;
}elsif($dir eq "south"){
$pxp = $py;
$pyp = -$px;
}elsif($dir eq "west"){
$pxp = -$px;
$pyp = -$py;
}else{
main::Log 1,"[RoombaUtils] invalid start direction $dir";
}
#-- Reduction not useful
push(@{$hash->{helper}{theta}},$theta);
push(@{$hash->{helper}{path}},$pxp,$pyp);
my $count = $hash->{helper}{pcount};
$count++;
$hash->{helper}{pcount}=$count;
my %ret = ("positionTheta",$theta,"positionCount",$count,"position","(".$pxp.",".$pyp.")");
return {%ret};
}
Klar ist auch, dass dann kein Pfad existiert, wenn das nicht abgefangen wird.
Undef
Kann nicht sein, wenn das Device existiert
LG
pah
Hallo an alle Roombauser,
seit gestern tut "Horst" (Roomba e5) hier seinen Dienst.
Würde die Anbindung an FHEM beim e5 über MQTT auch funktionieren?
Allerdings hat der e5 keine Kartennavigation und brummt zufällig durch die Bude.
Gruß,
Thorsten
Zitat
Kann eigentlich nur vorkommen, wenn die readingList nicht richtig gesetzt wird. Sonst würde das durch das Unterprogramm pose() abgefangen.
Und da haben wir auch schon die Lösung. Ich dachte, die Methode reading() ist nur dazu da, ungewollte Readings zu entfernen. Ich hatte folgenden Wert für readingList gesetzt.
$DEVICETOPIC:.* { json2nameValue($EVENT) }
Aber ja, es steht grundsätzlich im Wiki. Dass das für die Mapping funktion essentiell ist, war mir nicht klar.
Und das
undef kam daher, weil es {helper} tatsächlich nicht gab.
Nun funktioniert alles. Ohne Änderung. Perfekt.
Danke.
Zitat von: thoweiss am 06 Februar 2021, 09:33:28
Würde die Anbindung an FHEM beim e5 über MQTT auch funktionieren?
Indem der e5 App-Steuerung hat, würde ich schon annehmen, dass das funktioniert.
Ich nun wieder mit der Raum-Sache:
Das %room-Hash aus 99_RombaUtils ist mit folgenden Ergänzungen nicht mehr nötig, da alle Daten hiermit aus Attributen kommen.
Um das Erstellen der Attribute zu vereinfachen, kann man zu RoombaUtils folgende Methoden hinzufügen:
(und auch die Methode cleanRoom hat sich geändert, da die Werte ja nun nicht mehr aus dem %rooms Hash kommen)
sub cleanRoom($$$) {
my ($name,$levelName,$evt) = @_;
my $hash = $main::defs{$name};
my @evts = split(' ',$evt);
my $pmapId = main::AttrVal($name, 'floor_'.$levelName.'_pMapId', '');
my $userPmapvId = main::AttrVal($name, 'floor_'.$levelName.'_userPmapvId', '');
my $regionString = '"regions": [';
my $nrRegions = @evts;
for(my $regIdx = 1; $regIdx < $nrRegions; $regIdx++){
my $regionName = $evts[$regIdx];
my $regionId = main::AttrVal($name, 'room_'.$regionName.'_id', '');
my $regionType = main::AttrVal($name, 'room_'.$regionName.'_type', '');
$regionString = $regionString.'{"region_id": "'.$regionId.'", "type": "'.$regionType.'"}';
if ($regIdx +1 < $nrRegions) {
$regionString = $regionString.',';
}
}
$regionString = $regionString.']';
my $cmdString = '{"command": "start", "pmap_id": "'.$pmapId.'", '.$regionString.', "user_pmapv_id": "'.$userPmapvId.'", "ordered": 1, "time": '.time().', "
initiator": "localApp"}';
main::Log 1,"============>cleanRoom: $cmdString";
my $cmd = 'cmd '.$cmdString;
return $cmd;
}
sub createFloor($$) {
my ($name, $evt) = @_;
my $hash = $main::defs{$name};
my @evts = split(' ',$evt);
my $floorName = main::makeReadingName($evts[1]);
my $pMapId = $evts[2];
my $userPmapvId = $evts[3];
my $attrName = 'floor_'.$floorName.'_label';
main::addToDevAttrList($name, $attrName);
$main::attr{$name}{$attrName} = $evts[1];
$attrName = 'floor_'.$floorName.'_pMapId';
main::addToDevAttrList($name, $attrName);
$main::attr{$name}{$attrName} = $pMapId;
$attrName = 'floor_'.$floorName.'_userPmapvId';
main::addToDevAttrList($name, $attrName);
$main::attr{$name}{$attrName} = $userPmapvId;
}
sub createRoom($$) {
my ($name, $evt) = @_;
my $hash = $main::defs{$name};
my @evts = split(' ',$evt);
my $roomName = main::makeReadingName($evts[1]);
my $floor = $evts[2];
my $roomId = $evts[3];
my $roomType = $evts[4];
my $attrName = 'room_'.$roomName.'_label';
main::addToDevAttrList($name, $attrName);
$main::attr{$name}{$attrName} = $evts[1];
$attrName = 'room_'.$roomName.'_floor';
main::addToDevAttrList($name, $attrName);
$main::attr{$name}{$attrName} = $floor;
$attrName = 'room_'.$roomName.'_id';
main::addToDevAttrList($name, $attrName);
$main::attr{$name}{$attrName} = $roomId;
$attrName = 'room_'.$roomName.'_type';
main::addToDevAttrList($name, $attrName);
$main::attr{$name}{$attrName} = $roomType;
}
setList erhält entsprechend folgende neuen Einträge:
createFloor {roomba::createFloor($NAME, $EVENT)}
createRoom {roomba::createRoom($NAME, $EVENT)}
Dann legt man die Etagen an. zB mit
set device createFloor <Etagenname> <pMapId> <userPmapvId>
set device createFloor Erdgeschoss 5yyyyyyyxxxxxxxxw 2xxxxxTyyyyy4
Dadurch werden pro Etage folgende Attribute angelegt
floor_EG_label EG
floor_EG_pMapId 5yyyyyyyxxxxxxxxw
floor_EG_userPmapvId 2xxxxxTyyyyy4
Räume werden so angelegt:
set device createRoom <Raumname> <Etagenname> <Raum-ID> <Raum-Typ>
set device createRoom Kueche EG 7 rid
Dadurch erhält man folgende Attribute pro Raum
room_Kueche_floor EG
room_Kueche_id 7
room_Kueche_label Kueche
room_Kueche_type rid
Im Attributnamen ist nur der Name des Raums drin, nicht jener der Etage. Wer also zwei WCs besitzt, muss verschiedene Raumnamen vergeben (zB WC_EG, WC_OG), weil der zweite Aufruf von createRoom sonst die Werte des ersten Raumes überschreibt.
Ganz wichtig: unbedingt "Save config" klicken, auch wenn kein Fragezeichen angezeigt wird. Die gesetzten Attribute gehen sonst bei einem Neustart verloren.
Ein Bug in main::addToDevAttrList?
Mit dieser Änderung sind alle Variablen aus 99_RoombaUtils verschwunden und somit sollten diese Methoden eigentlich stabil sein.
Ständiger Wartungsaufwand und FHEM Restarts bei Änderungen sind also nicht mehr nötig.
schöne Grüße
Martin
Ich denk mal drüber nach...
ZitatAber ja, es steht grundsätzlich im Wiki.
Wieso "grundsätzlich" ? Ich würde sagen "wörtlich".
LG
pah
Zitat von: thoweiss am 06 Februar 2021, 09:33:28
Würde die Anbindung an FHEM beim e5 über MQTT auch funktionieren?
Hi,
ja, hab auch einen Roomba E5 (E5158) und die Einrichtung funktioniert wie im Wiki beschrieben. Bloß die "Komfortfunktionen für Readings" funktionieren nicht alle, ich musste
99_RoombaUtils.pm etwas anpassen. Kann ich dir gerne schicken. Oder du lässt es bei dem
readingList $DEVICETOPIC:.* { json2nameValue($EVENT) } mit allen MQTT readings.
Siehe https://forum.fhem.de/index.php/topic,114166.msg1119270.html#msg1119270 und folgende.
Gruß,
Thomas
Zitat von: Prof. Dr. Peter Henning am 06 Februar 2021, 19:00:45
Wieso "grundsätzlich" ? Ich würde sagen "wörtlich".
Ich denke, meine Wahrnehmung wurde durch den Begriff "Komfortfunktion" verfälscht, da ich erstmal gern alle Readings sehen wollte.
Ein Satz wie "Die Funktion readings() ist außerdem zum Erstellen der Reinigungskarten nötig" hätte sogar mir die Augen geöffnet ;D
schöne Grüße
Martin
Zitatich musste 99_RoombaUtils.pm etwas anpassen
Wie?
LG
pah
Zitat von: loetmeister am 06 Februar 2021, 20:16:08
Hi,
ja, hab auch einen Roomba E5 (E5158) und die Einrichtung funktioniert wie im Wiki beschrieben.
Gruß,
Thomas
Dann erde ich mich damit einmal beschäftigen, Fuktioniert die Steuerung über fhem auch parallel mit der Roomba App.
Gruß,
Thorsten
Was ist mit "parallel" gemeint? Die App kann zwar benutzt werden - allerdings teilt der Roboter FHEM nicht von sich aus mit, dass er gestartet ist. Dafür müsste FHEm ihn regelmäßig kontaktieren - und das ist derzeit noch nicht gut gelöst.
LG
pah
Ich meine ob die APP auch noch funktioniert, wenn ich den Roomba in FHEM "anmelde".
Oder geht nur "entweder FHEM oder die APP"
Danke und Gruß,
Thorsten Weiss
Zitat von: thoweiss am 08 Februar 2021, 19:07:09
Ich meine ob die APP auch noch funktioniert, wenn ich den Roomba in FHEM "anmelde".
Oder geht nur "entweder FHEM oder die APP"
Danke und Gruß,
Thorsten Weiss
Nach meinen Erfahrungen geht beides.
Aber die tauschen sich nicht allzu gut aus.
Du kannst über fhem zum Beispiel die Attribute für die Reinigungszeiten in der APP setzen, und er würde dann auch von sich aus losrumpeln (beziehungsweise den Reinigungszeitplan in der App zeigen).
Allerdings von sich aus, und ohne fhem Bescheid zu geben.
Wenn Du ihn von fhem aus losschickst, sieht die Sache anders aus:
Die Äpp kriegt es mit.
Für mich ist die Lösung aktuell:
- fhem schickt den Roboter los. Denn fhem weiß, was bei mir daheim los ist. fhem wird in Zukunft auch über Doppel- und Katenreinigung entscheiden.
- Die APP macht die Reinigungskarten. Denn die Kartenfunktion des Moduls schiesst mir so etwa ein Mal pro Woche fhem ab.
ZitatDie APP macht die Reinigungskarten. Denn die Kartenfunktion des Moduls schiesst mir so etwa ein Mal pro Woche fhem ab.
Erstens ist es kein Modul, sondern nur eine Sammlung von Hilfsfunktionen.
Zweitens sollten bei einer solchen Aussage irgendwelche Fehlermeldungen mitgeliefert werden, "abschießen" ist ziemlich dünn.
Drittens tauschen sich App und FHEM
GAR NICHT aus - wie auch? Bitte nicht solche Nebelkerzen zünden.
Die Roomba-App fragt periodisch den Roboter nach seinem Status, nur darum wird davon ein Start per FHEM festgestellt. Das kann man problemlos auch ich FHEM einstellen, dann wird in FHEM auch der Start per App festgestellt. Das habe ich aus Zeitgründen bisher noch nicht in die Hilfsroutinen eingebaut.
LG
pah
Hallo zusammen,
ich habe es jetzt hinbekommen.
Mein E5 ist in FHEM eingebunden, die parallele Steuerung über FHEM und Roomba-App funktioniert problemlos.
Leider stellt mein E5 ja keine Positionsdaten bereit, da er ja nach dem Chaosprinzip reinigt.
Mal sehen welche Verknüpfungen mir jetzt einfallen.
Dank auch an Prof. Dr. Peter Henning für die Modulentwicklung.
Gruß,
Thorsten
ZitatLeider stellt mein E5 ja keine Positionsdaten bereit, da er ja nach dem Chaosprinzip reinigt.
Hmmm. "Chaos" ist etwas anderes, der E5 benutzt zufällige Richtungsänderungen. Allerdings habe ich Zweifel, dass er keine Positionsdaten kennt - denn irgendwie muss er ja zur Basis zurückfinden. Vorschlag: Mal mit dem "nackten" Wert für readingsList
Zitat$DEVICETOPIC:.* { json2nameValue($EVENT) }
laufen lassen und ein Listing aller Readings hier posten.
LG
pah
Hallo zusammen,
bin ein absoluter Neuling und habe es geschafft, meinen E5 mit FHEM zu verbinden - jippieh. Auch ein Gerät, in dem die Readings angezeigt werden, habe ich erstellt.
Leider scheitere ich daran, die setlist "funktionierend" in FHEM zu kopieren aus dem Wiki.
Was ist daran falsch:
attr Roomba_E5_Device setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \ dock cmd {"command": "dock", "time": 1, "initiator": "localApp"} \ resume cmd {"command": "resume", "time": 1, "initiator": "localApp"} \ pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
Vielen Dank für Eure Hilfe.
Marco
Zitat von: marboj am 18 Februar 2021, 12:06:43
Was ist daran falsch:
betr. Forum: Fehlende Code-Tags (das Kreuz)
betr. dein FHEM (vermutlich) das Missverständnis, was die Bachslashes (\) angeht:
Die kommen aus einer RAW-Darstellung, und bedeuten dort einen escapten Zeilenumbruch. Du scheinst was anderes daraus gemacht zu haben. Würde empfehlen, das über "das grüne Plus" einzugeben und darauf zu achten, dass jeweils (direkt!) nach jedem Backslash dann der Zeilenumbruch kommt.
Wenn's dann nicht klappt, bitte eine komplette RAW-DEF hier posten (in der Detailansicht in fHEMWEB ganz unten aufzurufen).
Komischerweise ist das grüne Kreuz gar nicht da >:(. Habe gestern das System aufgesetzt und das eine oder andere installiert. Warum das weg ist, weiss ich nicht...
hier der Raw-Output:
defmod Roomba_E5_Device MQTT2_DEVICE 3167072470415630
attr Roomba_E5_Device IODev Roomba_E5
attr Roomba_E5_Device devicetopic 3167072470415630
attr Roomba_E5_Device readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
attr Roomba_E5_Device setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \ dock cmd {"command": "dock", "time": 1, "initiator": "localApp"} \ resume cmd {"command": "resume", "time": 1, "initiator": "localApp"} \ pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
setstate Roomba_E5_Device dock
setstate Roomba_E5_Device 2021-02-18 12:20:33 state dock
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_batInfo_cCount 387
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_batInfo_mData 3030303330343032000000000000000000000000000000000000000000000000
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_batInfo_mDate 2018-05-23
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_batInfo_mDaySerial 22370
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_batInfo_mLife 0C650A84108009C34E36000C04ADF53100C2FE7C2CFCFFFF11AC340E00000000
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_batInfo_mName PanasonicEnergy
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_batPct 100
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_batteryType F12432832R
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbchg3_estCap 1686
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbchg3_nAvail 1776
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbmssn_aCycleM 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbmssn_aMssnM 24
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbmssn_nMssn 632
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbmssn_nMssnC 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbmssn_nMssnF 47
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbmssn_nMssnOK 585
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpanic_panics_1 15
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpanic_panics_2 17
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpanic_panics_3 15
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpanic_panics_4 12
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpanic_panics_5 17
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_1 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_10 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_2 6
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_3 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_4 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_5 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_6 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_7 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_8 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbpause_pauses_9 9
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrstinfo_causes 0000
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrstinfo_nMobRst 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrstinfo_nNavRst 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_hr 632
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_min 36
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_nCBump 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_nCliffsF 5174
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_nCliffsR 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_nMBStll 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_nPanics 5490
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_nPicks 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_nScrubs 1600
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_nStuck 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_nWStll 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bbrun_sqft 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_binPause false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bin_full false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bin_present true
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_bootloaderVer 2.5
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cap_eco 1
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cap_ota 1
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cap_svcConf 1
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_carpetBoost false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_cycle clean
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_error 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_expireM 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_expireTm 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_initiator localApp
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_mssnM 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_mssnStrtTm 1613647098
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_nMssn 632
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_notReady 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_phase hmUsrDock
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_rechrgM 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanMissionStatus_sqft 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_cycle_1 none
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_cycle_2 start
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_cycle_3 start
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_cycle_4 start
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_cycle_5 start
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_cycle_6 start
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_cycle_7 none
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_h_1 6
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_h_2 9
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_h_3 9
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_h_4 9
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_h_5 9
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_h_6 9
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_h_7 9
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_m_1 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_m_2 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_m_3 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_m_4 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_m_5 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_m_6 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_cleanSchedule_m_7 0
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_cloudEnv prod
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_country DE
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_dock_known true
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_ecoCharge false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_hardwareRev 4
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_10_nl-NL 5
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_11_da-DK 6
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_12_sv-SE 7
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_13_nb-NO 8
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_14_fi-FI 16
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_15_pl-PL 10
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_16_cs-CZ 17
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_17_ru-RU 18
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_18_he-IL 20
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_19_ja-JP 13
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_1_en-US 0
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_20_zh-CN 14
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_21_zh-TW 9
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_2_en-GB 15
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_3_fr-FR 1
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_4_de-DE 2
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_5_es-ES 3
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_6_es-XL 11
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_7_pt-PT 12
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_8_pt-BR 19
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_langs_9_it-IT 4
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_language 2
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_lastCommand_command dock
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_lastCommand_initiator localApp
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_lastCommand_time 1
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_lastDisconnect 2
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_mac 80:c5:f2:dc:ff:40
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_mobilityVer 1086
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_name Rüdiger
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_netinfo_addr 3232235608
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_netinfo_bssid 98:9b:cb:bd:a6:f6
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_netinfo_dhcp true
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_netinfo_dns1 3232235530
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_netinfo_dns2 0
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_netinfo_gw 3232235530
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_netinfo_mask 4294967040
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_netinfo_sec 4
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_noAutoPasses false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_noPP false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_openOnly false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_r2a_monits false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_r2a_params_monitConditions 8
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_r2a_params_monitPeriodMs 1000
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_schedHold false
setstate Roomba_E5_Device 2021-02-18 12:18:22 state_reported_signal_rssi -51
setstate Roomba_E5_Device 2021-02-18 12:18:22 state_reported_signal_snr 38
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_sku e515440
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_softwareVer 3.4.62+95
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_soundVer 14
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_svcEndpoints_svcDeplId v005
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_timezone Europe/Berlin
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_twoPass false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_tz_events_1_dt 1604232000
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_tz_events_1_off 60
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_tz_events_2_dt 1616893201
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_tz_events_2_off 120
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_tz_events_3_dt 1635642001
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_tz_events_3_off 60
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_tz_ver 9
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_vacHigh false
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_wifiAnt 1
setstate Roomba_E5_Device 2021-02-18 12:20:44 state_reported_wifiSwVer 3.4.62+95
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_wifistat_cloud 1
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_wifistat_uap false
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_wifistat_wifi 1
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_wlcfg_sec 7
setstate Roomba_E5_Device 2021-02-18 12:20:43 state_reported_wlcfg_ssid 373339302D4C573261
@marboj Du scheinst verwirrt ::)
https://forum.fhem.de/index.php/topic,71806.0.html
https://wiki.fhem.de/wiki/Import_von_Code_Snippets
Der Code richtig aus dem Wiki - so in der Raw Def eingeben!
attr Roomba_E5_Device setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"} \
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"} \
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
oder so in DEF (attr Editor)
start cmd {"command": "start", "time": 1, "initiator": "localApp"}
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"}
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"}
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
Und das Ding heißt wirklich "Rüdiger" ?
Ich sehe wirklich keine Koordinatenangaben. Doofe Kiste.
LG
pah
@Otto123 Vielen Dank, passt jetzt....
@Prof. Dr. Peter Henning Yepp, unser Bügelrobot heißt Karl-Günther ;-)
Zitat von: Beta-User am 18 Februar 2021, 12:21:31
betr. Forum: Fehlende Code-Tags (das Kreuz)
...immer noch! ("Kreuz" => '#'-Button)
Was das fehlende "grüne Kreuz" angeht: Es gibt irgendeinen "neuen" Videoblogger, der meint, man müsse f18 ("Select style") gleich durch irgendwas anderes ersetzen. Vermutlich hast du dich da inspirieren lassen...? (Hände weg von "Erklärvideos" dieser Art und Güte...! Im Zweifel führt das nur dazu, dass hier keiner helfen kann oder eine Idee hat, wo das herkommt...)
Sorry, habe FHEM noch keine 24 Stunden.
@Beta-User: Habe gestern mal die Styles durchgespielt und dann auf default gestellt. Das war der Fehler...
Danke für Eure promte Hilfe...
Zitat von: marboj am 18 Februar 2021, 13:30:51
@Beta-User: Habe gestern mal die Styles durchgespielt und dann auf default gestellt. Das war der Fehler...
Ich weiß das ist hier OT aber weil wir gerade beieinander sind: Ist das nicht ne "Leiche" https://forum.fhem.de/index.php?topic=90983.0 nach 2 Jahren? Ich meine man kann default mit Voreinstellung übersetzen.
Nein, das ist keine Leiche, sondern eine daemliche Entscheidung vor 15 Jahren.
Ich weiss nicht, wie ich default ohne Aerger umbenennen soll.
Zitat von: rudolfkoenig am 18 Februar 2021, 14:18:11
Ich weiss nicht, wie ich default ohne Aerger umbenennen soll.
Eine abschließende Idee habe ich dazu nicht, aber bevor wir in 15 Jahren noch darüber diskutieren: Wie wäre es, für eine längere Übergangsphase (12 Monate?) die User dadurch zu beglücken, dass bei jedem Neustart "default" nach "old_default" umbenannt wird und "default" nicht mehr zur Auswahl steht? Damit sollte "nichts" => f18 möglich werden und verhindert sein, dass Neulinge in diese seltsame Falle tappen...
Und die, die den "gewohnten" Style wollen, können ihn weiter ohne größere Eingriffe haben.
(Das verhindert zwar nicht, dass Videoblogger trotzedem unglückliche Empfehlungen geben, aber "Spielkinder" finden dann den Weg evtl. besser zurück und "f25" könnte leichter "f18" ersetzen (womit nicht gesagt sein soll, dass Bedarf an Ersatz für f18 bestünde)).
Lass Rudi seine Leichen!
LG
pah
Hallo,
ich habe meinen Roomba nach Anleitung aus dem Wiki in Fhem installiert.
Nach Abschluss eines Reinigungsauftrages erhalte ich nachstehende Meldung und Fhem ist nicht mehr erreichbar (eingefroren).
2021.02.19 06:21:15.973 1: [RoombaUtils] Device Roomba_neu phase transition stop -> charge
2021.02.19 06:37:07.045 1: [RoombaUtils] transition charge -> run should start intialization
2021.02.19 06:37:07.046 1: [RoombaUtils] Initialization of map for device Roomba_neu
2021.02.19 06:37:13.933 1: [RoombaUtils] pausing run -> stop
2021.02.19 06:37:16.967 1: [RoombaUtils] transition stop -> hmUsrDock should start finalization
2021.02.19 06:37:16.967 1: [RoombaUtils] Finalization of map for device Roomba_neu
2021.02.19 06:37:16.968 1: PERL WARNING: Use of uninitialized value in subtraction (-) at /usr/share/perl5/Math/ConvexHull.pm line 88.
Kann mir hier jemand weiterhelfen?
Vielen Dank im Voraus und schönes Wochenende schon mal.
Dieter
Hallo,
auch ich habe heute meinen Roomba nach der Anleitung aus dem Wiki installiert.
Hätte aber dazu eine Frage.
Im Wiki ist auch erklärt, wie man eine Reinigungskarte erstellt.
Geht das auch, wenn man den Roomba i7 in 2 Geschoßen (EG und OG) einsetzen möchten?
Danke im Voraus
lg, Gerhard
p.s.: kleine Anmerkungen:
- Die Datei "99_RoombaUtils.pm" ist bei mir nicht unter "fhem/contrib" zu finden. Im contrib gibt es kein Verzeichnis "Roomba" und keine Datei "". Habe sie dann aus svn.fhem.de kopiert.
- Man muss noch die folgenden perl-Module installieren "Math::ConvexHull" und "Math::Polygon::Calc".
ZitatKann mir hier jemand weiterhelfen?
Der Aufruf zur Bestimmung der konvexen Hülle ist gekapselt
eval(@newhull = @{convex_hull(\@newpoints)}) ;
und bringt FHEM eigentlich nicht zum Absturz. Und was mit "Einfrieren" gemeint ist, verstehe ich nicht ganz.
Also bitte mal das Attribut SVG_room löschen, dann wird das Hin und Her mit den Dateien gar nicht erst veranstaltet. Dafür LOG_dir setzen, dann wird eine einfachere Protokollierung der erhaltenen Daten durchgeführt. Und dann sehen wir weiter.
ZitatGeht das auch, wenn man den Roomba i7 in 2 Geschoßen (EG und OG) einsetzen möchten?
Klar. Dazu setzt man beim Wechsel des Geschosses durch einen FHEM-Befehl die Attribute SVG_room, SVG_final, startx, starty, startdir auf andere Werte.
ZitatDie Datei "99_RoombaUtils.pm" ist bei mir nicht unter "fhem/contrib" zu finden
Natürlich nicht. Wie man an vielen Stellen im Forum nachlesen kann, wird der Ordner contrib nicht automatisch upgedatet...Wie man das macht, ist dort ebenfalls nachzulesen.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 20 Februar 2021, 05:51:52
Der Aufruf zur Bestimmung der konvexen Hülle ist gekapselt
eval(@newhull = @{convex_hull(\@newpoints)}) ;
und bringt FHEM eigentlich nicht zum Absturz. Und was mit "Einfrieren" gemeint ist, verstehe ich nicht ganz.
Also bitte mal das Attribut SVG_room löschen, dann wird das Hin und Her mit den Dateien gar nicht erst veranstaltet. Dafür LOG_dir setzen, dann wird eine einfachere Protokollierung der erhaltenen Daten durchgeführt. Und dann sehen wir weiter.
LG
pah
Hallo und danke für die Unterstützung.
Mit "Einfrieren" meine ich, dass ich in der Web Oberfläche nichts mehr anwählen bzw. steuern kann.
Das Attribut SVG_room existiert bei mir nicht da ich mit der Kartenerstellung noch nichts gemacht habe.
Kann daher der Fehler rühren?
Danke und VG
Dieter
Nein.
Zitat von: Prof. Dr. Peter Henning am 20 Februar 2021, 08:59:13
Nein.
Das hilft mir jetzt leider nicht weiter.
Was kann oder soll ich noch tun?
Werden noch weitere Infos benötigt?
VG Dieter
Zitat von: Prof. Dr. Peter Henning am 20 Februar 2021, 05:51:52
Klar. Dazu setzt man beim Wechsel des Geschosses durch einen FHEM-Befehl die Attribute SVG_room, SVG_final, startx, starty, startdir auf andere Werte.
Natürlich nicht. Wie man an vielen Stellen im Forum nachlesen kann, wird der Ordner contrib nicht automatisch upgedatet...Wie man das macht, ist dort ebenfalls nachzulesen.
Hallo Pah,
Ich lese eigentlich viel mit, aber das mit dem contrib-Verzeichnis ist mir neu.
Das schau ich mir gleich mal an.
Natürlich kann man das mit den Attributen so machen.
Allerdings verändert man dadurch auch jedesmal die Konfig und fhem zeigt das ,,?" im Menü.
Zwei Dinge sind mir noch aufgefallen:
- Im Reading ,,cmMap" wird die IP-Adresse des fhem falsch angegeben.
Da wird in der Datei ,,99_RoombaUtils.pm" in der Funktion ,,finalizemap" noch eine fixe Adresse verwendet.
Oder habe ich eine alte Version aus dem svg gezogen?
- bei mir wird kein Reading ,,battery" angelegt.
Wo kann ich da ansetzen?
Vielen Dank jedenfalls für Deine tolle Arbeit.
Lg, Gerhard
Zitat
Oder habe ich eine alte Version aus dem svg gezogen?
Ja.
Zitat
Wo kann ich da ansetzen?
Die aktuelle Version steht weiter oben irgendwo im Anhang, ist aber inzwischen auch eingecheckt.
LG
pah
Hallo,
wie kann ich das Erstellen von Reinigungskarten deaktivieren?
Danke und VG
Dieter
Zitat von: Prof. Dr. Peter Henning am 21 Februar 2021, 04:55:52
Die aktuelle Version steht weiter oben irgendwo im Anhang, ist aber inzwischen auch eingecheckt.
Danke. Mit der Version weiter vorne klappt es.
Echt tolle Arbeit!
lg, Gerhard
Hallo,
Je mehr "Spielzeug" ich mir zulege, desto mehr bin ich froh damals auf fhem gesetzt zu haben - Roomba i7 ausgepackt, mit fhem gekoppelt, läuft :-) Danke für die tolle Arbeit!
Ich kann den i7 starten, stoppen, ins Dock schicken... allerdings komme ich mit den Readings nicht wirklich weit. Der i7 spuckt jede Menge Infos aus, aber offensichtlich fast alle zusammen in einer einzelnen großen Message. In fhem tauchen dann nur ein paar Readings auf, namentlich die "cm*" und "signalRSSI" (das ist auch die einzige "Einzelnachricht" die ich sonst im log sehe). Ich kann nicht wirklich Perl, aber wenn ich die 99_RoombaUtils durchflöhe dann sieht das so aus, als würde die sub readings() mit return geplant in den ifs beenden, wenn irgendeine der Abfragen zieht. In diesem Fall eben "cleanMissionStatus", womit alle anderen Infos nicht mehr ausgewertet werden. Somit kommt auch z. B. nie ein batPct an :-( Interpretiere ich das richtig? Wenn ja, wie müsste man das angehen, um die gesamte, große Nachricht zu parsen?
Offensichtlich behandelt der i7 auch die Schedules anders. Das ReadingsVal "ProgWeek", das in der setschedule() gelesen werden will gibt's bei mir nicht (taucht auch in der Message vom i7 nicht auf), und cleanSchedule heißt beim i7 wohl cleanSchedule2_1 (wenn ich in der Roomba app einen Zeitplan anlege), mit start_day_n (n=1...7). Zumindest sehe ich das beim parsen der Message. Wohl ein anderer Mechanismus...
Übrigens ist meine 99_RoombaUtil in /fhem/contrib lt. diff identisch zu der aus https://svn.fhem.de/fhem/trunk/fhem/contrib/Roomba/ - wird das nun doch automatisch aktualisiert, oder suche ich an der falschen Stelle?
Danke und VG,
Hermann
Hallo,
funktioniert bei Dir die Datei-Version aus svn?
Da hat sich anscheinend ein Fehler in der Zeile 210 eingeschlichen.
Es fehlt eine ")" in der if-Abfrage:
if(main::Value($iodev) ne "opened"{
lg, Gerhard
Hallo Hermann,
bei dem E5 sind die MQTT Nachrichten auch anders strukturiert, ich hatte 99_RoombaUtils.pm etwas angepasst... Siehe https://forum.fhem.de/index.php/topic,114166.msg1120926.html#msg1120926, bzw. https://forum.fhem.de/index.php/topic,114166.msg1119270.html#msg1119270 und folgende.
99_RoombaUtils.pm must du manuell aktualisieren..
Gruß,
Thomas
ZitatDa hat sich anscheinend ein Fehler in der Zeile 210 eingeschlichen.
Werde ich morgen ansehen - so etwas kann immer passieren, weil ich meine aktuelle Version (immerhin "work in progress") kurzerhand ins SVN geschickt habe.
Darum steht das ja auch im contrib, und nicht in der Hauptdistribution...
Heut bin ich nach eine schönen sonnigen Golfrunde nicht in Stimmung, morgen muss ich noch 40 Klausuren korrigieren, und dann kommt wieder Roomba dran.
LG
pah
kein Thema, Job und Privates gehen immer vor ;)
Hi Thomas,
super, Danke! Die ifs habe ich auch schon mal testweise auseinandergezogen, aber mit den hashes / returns bin ich nicht zurechtgekommen. Über Deinen Post mit den Anpassungen habe ich tatsächlich drübergelesen, aber nicht erkannt - sorry.
Wird die Woche gleich ausprobiert!
"Manuell aktualisieren" - von hier: https://svn.fhem.de/fhem/trunk/fhem/contrib/Roomba/ ? Oder geht das nur über subversion?
Danke schon mal,
Hermann
Zitat von: hapege am 21 Februar 2021, 18:32:32
Somit kommt auch z. B. nie ein batPct an
Bei mir heißt das Reading "battery"
Zitat von: hapege am 21 Februar 2021, 18:32:32
Interpretiere ich das richtig? Wenn ja, wie müsste man das angehen, um die gesamte, große Nachricht zu parsen?
Du kannst in der Methode
reading angeben, wie du die Readings verarbeiten willst (und welche du behalten willst).
Wenn du die ganz "rohen" Readings haben willst, kannst du im Attribut
readingList anstatt
$DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)} nur
$DEVICETOPIC:.* { json2nameValue($EVENT) } verwenden. Dann funktioniert aber auch zB die Kartenerstellung nicht mehr, und auch die interessanteren Readings (Akkustand, aktueller Status, etc) heißen dann anders.
Zitat von: dk3572 am 19 Februar 2021, 09:37:41
Hallo,
ich habe meinen Roomba nach Anleitung aus dem Wiki in Fhem installiert.
Nach Abschluss eines Reinigungsauftrages erhalte ich nachstehende Meldung und Fhem ist nicht mehr erreichbar (eingefroren).
2021.02.19 06:21:15.973 1: [RoombaUtils] Device Roomba_neu phase transition stop -> charge
2021.02.19 06:37:07.045 1: [RoombaUtils] transition charge -> run should start intialization
2021.02.19 06:37:07.046 1: [RoombaUtils] Initialization of map for device Roomba_neu
2021.02.19 06:37:13.933 1: [RoombaUtils] pausing run -> stop
2021.02.19 06:37:16.967 1: [RoombaUtils] transition stop -> hmUsrDock should start finalization
2021.02.19 06:37:16.967 1: [RoombaUtils] Finalization of map for device Roomba_neu
2021.02.19 06:37:16.968 1: PERL WARNING: Use of uninitialized value in subtraction (-) at /usr/share/perl5/Math/ConvexHull.pm line 88.
Kann mir hier jemand weiterhelfen?
Vielen Dank im Voraus und schönes Wochenende schon mal.
Dieter
Hallo,
ist hier evtl. einer so nett und hilft mir weiter?
Wir würde schon eine Erklärung reichen, wie ich die Erstellung der Karten deaktivieren kann.
Vielen Dank und Gruß
Dieter
Hi Dieter,
Zitat von: dk3572 am 23 Februar 2021, 15:15:47
Wir würde schon eine Erklärung reichen, wie ich die Erstellung der Karten deaktivieren kann.
Das wurde in einem Vorpost mal so beantwortet:
Zitat von: Prof. Dr. Peter Henning am 29 Januar 2021, 04:43:35
Es reicht, das Attribut SVG_room zu löschen.
Ich gehe davon aus, dass das jetzt immer noch so ist.
Ansonsten hilft wohl Löschen und Neu einrichten vom Device laut Anleitung. Den Teil mit Kartenerstellung dann einfach weglassen :-)
LG
Martin
Zitat von: delMar am 23 Februar 2021, 18:56:18
Hi Dieter,
Das wurde in einem Vorpost mal so beantwortet:
Ich gehe davon aus, dass das jetzt immer noch so ist.
Ansonsten hilft wohl Löschen und Neu einrichten vom Device laut Anleitung. Den Teil mit Kartenerstellung dann einfach weglassen :-)
LG
Martin
Hallo Martin,
danke für deine Unterstützung.
Wie im Vorpost auch zu lesen ist, gibt es das Attribut SVG_room bei mir nicht, da ich den Teil mit Kartenerstellung erst gar nicht hinzugefügt habe.
Hast du noch einen weiteren Tipp?
Evtl. in der 99_RoombaUtils.pm etwas aus kommentieren?
Danke und VG
Dieter
Zitat von: dk3572 am 23 Februar 2021, 19:57:16
Wie im Vorpost auch zu lesen ist, gibt es das Attribut SVG_room bei mir nicht, da ich den Teil mit Kartenerstellung erst gar nicht hinzugefügt habe.
Hast du noch einen weiteren Tipp?
Evtl. in der 99_RoombaUtils.pm etwas aus kommentieren?
Also ich hab das mit der Kartenerstellung ja auch nicht mit drin, und da blockiert dann auch nix bei mir.
Als ich sie drin hatte, ging der FHEM Perl-Prozess schon auch auf 100% CPU-Last, aber mit dem Entfernen des Attributs wie beschrieben war dann wieder alles gut bei mir.
Und für genauere Analysen hatte ich noch keine Zeit.
Ganz generisches Fehlersuchmuster: bist du dir sicher, dass es die Kartenerstellung ist, die blockiert?
Der Log-Eintrag, der unmittelbar vorm Einfrieren da sein müsste, wäre sowas wie "[RoombaUtils] Finalization of map for device ...". Auf Log-Level 1. Also bitte sicherstellen, dass global verbose auf 1 steht. Eine Änderung im Device selber ändert in einer Utils-Methode nix (würde sie vielleicht, aber hier wird Log statt Log3 verwendet, was aufs globale log-level geht - wohl, weil es sich ohnehin um Utility Methoden handelt)
Wenn es die Kartenerstellung ist, dann sollte das Auskommentieren der Zeile #612 diesen Aufruf (finalizemap) entfernen. Dann is aber immer noch fraglich, warum das überhaupt eintritt, wenn es das Attribut nicht gibt. Vielleicht einer dieser feinen Unterschiede zwischen den Produktreihen, die dann unterschiedliches Verhalten bewirken... wurde hier schon ein- zwei mal erwähnt.
Jo, mehr fällt mir dazu auch nicht ein.
Viel Glück
schöne Grüße
Martin
Habe mal ne kurze Frage zum Roomba.
Habe ihn erfolgreich in FHEM integriert. Habe auch schon rausgefunden, dass immer dann, wenn sich dem MQTT2-Client connected, das MQTT2-Device des Roomba neue Readings übertragen bekommt.
Bei mir passiert diese Aktualisierung gefühlt zweimal am Tag. Kann man die Häufigkeit ändern? Wie wird überhaupt das Aktualisieren angestoßen?
Gruß
Marco
Zitat von: marboj am 26 Februar 2021, 11:13:37
Kann man die Häufigkeit ändern? Wie wird überhaupt das Aktualisieren angestoßen?
Wenn du am IODevice vom Roomba (also am MQTT2-Client device, nicht direkt am Roomba-Device) ein
connect machst, werden die Readings automatisch aktualisiert.
So würde das zB alle 15 Minuten passieren:
define atRoombaUpdate at *00:15 set iRobotRoombaClient connect
Der Disconnect erfolgt dann ohnehin automatisch nach einigen Sekunden.
schöne Grüße
Martin
ok. An den at-Befehl habe ich auch gedacht. Ich hatte gedacht, es gibt beim Device eine Art "refresh".
Nun gut, so mache ich das, allerdings besser so:
define atRoombaUpdate at +*00:15 set iRobotRoombaClient connect
Damit es sich wiederholt ;-)
Eine Anfängerfrage noch zu den 99_RoombaUtils.pm:
Habe gem. Wiki-Eintrag das stateformat wie folgt definiert: attr Roomba_E5 stateFormat cmPhaseE (battery %)
Readingslist auch : readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
Die 99_RoombaUtils.pm in den entsprechenden Ordner /opt/fhem/FHEM kopiert.
FHEM neu gestartet.
Leider wird der Status immer noch so angezeigt: cmPhaseE (battery %)
Wie werden denn die "neuen" Readings erstellt? Was muss ich noch tun?
Hier mein Device:
defmod Roomba_E5_Device MQTT2_DEVICE 3167072470415630
attr Roomba_E5_Device IODev Roomba_E5
attr Roomba_E5_Device devicetopic 3XXXXXXXXXX0
attr Roomba_E5_Device icon vacuum_top
attr Roomba_E5_Device readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
attr Roomba_E5_Device room 10_Wohnzimmer
attr Roomba_E5_Device setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"} \
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"} \
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
attr Roomba_E5_Device stateFormat cmPhaseE (battery %)
attr Roomba_E5_Device webCmd start:dock:resume:pause
Hier das Log:
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2644) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2645) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2646) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2647) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2648) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2649) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2651) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2652) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2653) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2656) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2658) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2660) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2661) line 1.
2021.02.26 12:56:53 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $EVTPART2= $evalSpecials->{'%EVTPART2'};my $EVTPART3= $evalSpecials->{'%EVTPART3'};my $EVTPART4= $evalSpecials->{'%EVTPART4'};my $EVTPART5= $evalSpecials->{'%EVTPART5'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2663) line 1.
2021.02.26 12:56:54 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 2666) line 1.
Es fehlen wohl noch perl-module:
Can't locate Math/Polygon/Calc.pm in @INC (you may need to install the Math::Polygon::Calc module) (@INC contains: ./lib ./FHEM . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.28.1 /usr/local/share/perl/5.28.1 /usr/lib/arm-linux-gnueabihf/perl5/5.28 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.28 /usr/share/perl/5.28 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base) at ./FHEM/99_RoombaUtils.pm line 45.
BEGIN failed--compilation aborted at ./FHEM/99_RoombaUtils.pm line 45.
Wie installiere ich die?
bin ein Stück weiter:
habe die folgenden Module installiert:
sudo apt-get install libmath-polygon-perl
sudo apt-get install libmath-convexhull-perl
Nun kommen zwar keine Hinweise auf fehlendes Perl, aber trotzdem sieht es nicht schön aus:
2021.02.26 13:34:37 1: PERL WARNING: "my" variable $name masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 230.
2021.02.26 13:34:37 1: PERL WARNING: "my" variable $data masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 230.
2021.02.26 13:34:37 1: PERL WARNING: "state" variable @_ masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 230.
2021.02.26 13:34:37 1: PERL WARNING: "my" variable @evt masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 231.
2021.02.26 13:34:37 1: PERL WARNING: "my" variable $cmd masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 263.
2021.02.26 13:34:37 1: reload: Error:Modul 99_RoombaUtils deactivated:
syntax error at ./FHEM/99_RoombaUtils.pm line 210, near ""opened"{"
Global symbol "$cmd" requires explicit package name (did you forget to declare "my $cmd"?) at ./FHEM/99_RoombaUtils.pm line 214.
Global symbol "$cmd" requires explicit package name (did you forget to declare "my $cmd"?) at ./FHEM/99_RoombaUtils.pm line 214.
Global symbol "$cmd" requires explicit package name (did you forget to declare "my $cmd"?) at ./FHEM/99_RoombaUtils.pm line 215.
syntax error at ./FHEM/99_RoombaUtils.pm line 216, near "}"
Can't use global @_ in "my" at ./FHEM/99_RoombaUtils.pm line 219, near "= @_"
Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at ./FHEM/99_RoombaUtils.pm line 220.
syntax error at ./FHEM/99_RoombaUtils.pm line 227, near "}"
Can't use global @_ in "my" at ./FHEM/99_RoombaUtils.pm line 230, near "= @_"
syntax error at ./FHEM/99_RoombaUtils.pm line 265, near "}"
./FHEM/99_RoombaUtils.pm has too many errors.
Was kann icht jetzt tun?
Zitat von: marboj am 26 Februar 2021, 13:40:06
Was kann icht jetzt tun?
Da ist noch ein Tippfehler im eingecheckten Code. Wird in einem Vorpost mal erwähnt. Du musst wo eine schließende Klammer dazugeben, wenn ich mich recht erinnere
Zitat von: Prof. Dr. Peter Henning am 03 Februar 2021, 17:17:37
OK, das mit dem Neustart an der clean-Taste werde ich gerne mal probieren. Ich habe eine neue Version des Hilfsmoduls, die ich hier mal anhänge. Sie setzt während des Reinigungsvorgangs das disconnectAfter-Attribut hoch, funktioniert bei mir über die letzte Woche hinweg sehr gut.
LG
pah
Wie kann ich den Dateianhang herunterladen? Offenbar bin ich zu blöd...
Habe das:
if(main::Value($iodev) ne "opened"{)
in der Dateium die ) ergänzt und auch, weil ich an meinen Augen zweifle, mit } probiert.
Die Fehler sind immer noch da.
Vermutlich ist die angehängte Datei ready-to-use, oder?
Da der Dateianhang nicht mehr da zu sein scheint, habe ich aus dem svn die letzte Version geladen, die Klammer zu ) ergänzt und nun folgenden Fehler:
2021.02.26 15:10:00 1: PERL WARNING: Bareword found where operator expected at ./FHEM/99_RoombaUtils.pm line 211, near ")
main::fhem"
2021.02.26 15:10:00 1: PERL WARNING: (Missing operator before main::fhem?)
2021.02.26 15:10:00 1: PERL WARNING: "my" variable $name masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 230.
2021.02.26 15:10:00 1: PERL WARNING: "my" variable $data masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 230.
2021.02.26 15:10:00 1: PERL WARNING: "state" variable @_ masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 230.
2021.02.26 15:10:00 1: PERL WARNING: "my" variable @evt masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 231.
2021.02.26 15:10:00 1: PERL WARNING: "my" variable $cmd masks earlier declaration in same scope at ./FHEM/99_RoombaUtils.pm line 263.
2021.02.26 15:10:00 1: reload: Error:Modul 99_RoombaUtils deactivated:
Hallo,
Vermutlich nicht die richtige Stelle korrigiert? ;)
Hier steht wo die klammer hin gehört: https://forum.fhem.de/index.php/topic,114166.msg1134544.html#msg1134544
Edit, ok, so klar war der Beitrag nicht, daher:
if(main::Value($iodev) ne "opened"){
Gruß,
Thomas
Also, irgendwie hab ich (vielleicht) voll das Brett vorm Kopf:
Das ist der Beitrag:
Da hat sich anscheinend ein Fehler in der Zeile 210 eingeschlichen.
Es fehlt eine ")" in der if-Abfrage:
Code: [Auswählen]
if(main::Value($iodev) ne "opened"{
lg, Gerhard
Leider bin ich kein Programmierer, aber so if(main::Value($iodev)) ne "opened"{
läuft es auch nicht :(
Update: Es läuft... so if(main::Value($iodev) ne "opened"){
Gruß
Marco
Zitat von: marboj am 26 Februar 2021, 17:30:58
Leider bin ich kein Programmierer, aber so if(main::Value($iodev)) ne "opened"{
läuft es auch nicht :(
Nö. So muss Code
if(main::Value($iodev) ne "opened"){
schöne Grüße
Martin
ZitatLeider bin ich kein Programmierer
.
Gut so, ich würde mich gegen eine solch abwertende Bezeichnung auch wehren...
So, die 99_RoombaUtils haben jetzt größere Änderungen erfahren. Unter Anderem kann man mit einem User-Attribut das Datensammeln für eine Karte komplett unterbinden, siehe Wiki.
Außerdem gibt es ein Internal "Version".
Bei der Auswertung der Statusmeldungen vom Roomba geht die Software jetzt maximal flexibel vor, alle Modelle sollten damit zu Recht kommen.
LG
pah
Hallo Pah,
vielen Dank für die neue Version - läuft bei mir bis jetzt ohne Probleme.
Ich habe aber noch eine Bitte:
In Deinem Code habe ich gesehen, dass es auch ein Event names "netinfo" und darin ein Feld "bssid" gibt.
Wie kann ich dessen Wert in ein Reading bringen?
Könntest Du mir da bitte einen Tipp geben?
Der Hintergrund ist folgender:
Ich habe mehrere APs in meiner Wohnung und so kann ich automatisch erkennen, wenn sich der Roomba in einen anderen AP einloggt.
Und damit weiß ich z.B. dass er im OG oder im EG ist und kann dann die Maps entsprechend automatisch umstellen.
Danke im Voraus
lg, Gerhard
Hallo,
mir ist noch nicht ganz klar, was man mit dem neuen Befehl "periodicCmd" so alles anfangen kann.
Ich wollte mir wie hier https://forum.fhem.de/index.php/topic,114166.msg1135599.html#msg1135599 (https://forum.fhem.de/index.php/topic,114166.msg1135599.html#msg1135599), ein at definieren, um den myRoombaMQTTClient periodisch zu öffnen.
Aber eigentlich geht das mit dem "periodicCmd" im Staubsauger-Device eleganter:
Dazu habe ich mir einen Befehl update in setList definiert:
update:noArg {fhem("set ".InternalVal($NAME,"IODev","") . "connect")}
Und rufe das "update" alle z.B. 15min auf.
attr myRoomba periodicCmd update:15
Wäre das so gedacht?
Was könnte man damit noch machen?
Kann man das Senden der MQTT-Felder im Roomba auch irgendwie anstossen (z.B. ein "announce" o.ä. senden)? Momentan muss man ja warten, bis der Roomba was schickt.
Oder habe ich da was missverstanden?
Danke im Voraus
lg, Gerhard
Edit: Zum Öffnen des Devices muss natürlich "connect" statt "open" verwendet werden
Hallo ihr,
habe siet dem neuesten Update folgende Einträge im Log:
2021.03.01 09:12:02 1: [RoombaUtils] uncaught event {"state":{"reported":{"utctime":1614586321}}}
2021.03.01 09:12:07 1: [RoombaUtils] uncaught event {"state":{"reported":{"name": "Rüdiger"}}}
Was machen die bzw. was heißt das?
Zitat von: marboj am 01 März 2021, 10:22:26
habe siet dem neuesten Update folgende Einträge im Log:
2021.03.01 09:12:02 1: [RoombaUtils] uncaught event {"state":{"reported":{"utctime":1614586321}}}
2021.03.01 09:12:07 1: [RoombaUtils] uncaught event {"state":{"reported":{"name": "Rüdiger"}}}
Was machen die bzw. was heißt das?
Das heißt mWn, dass in den RoombaUtils noch nicht festgelegt wurde, ob diese Informationen als Readings gespeichert, oder verworfen werden sollen.
In diesem Fall werden sie wohl auch verworfen, allerdings mit diesen Hinweisen im Log.
Das ist eine ganz hervorragende Möglichkeit für einen Entwickler, Dinge ganz klar zu sehen, die bei ihm lokal nicht auftreten.
Wenn dich die Einträge stören, einfach verbose auf 0 stellen.
schöne Grüße
Martin
Nachdem ich nunmehr die 99_Roomba_Utils installiert habe, gehen meine Webbuttons nicht mehr:
<button>start</button>:<button>dock</button>:<button>resume</button>:<button>pause</button>:<button>stop</button>
Wie muß ich die denn nun anpassen, damit die wieder funktionieren?
Zitat von: marboj am 01 März 2021, 11:58:33
Nachdem ich nunmehr die 99_Roomba_Utils installiert habe, gehen meine Webbuttons nicht mehr:
<button>start</button>:<button>dock</button>:<button>resume</button>:<button>pause</button>:<button>stop</button>
Wie muß ich die denn nun anpassen, damit die wieder funktionieren?
Die funktionieren bei mir immer noch. Allerdings ist mir auch aufgefallen, dass man seit einiger Zeit 2x den Befehl ausführen muss, damit der Robot dann auch wirklich loslegt.
Als ob beim ersten Mal der Connect hergestellt würde, und dann beim zweiten Mal erst das tatsächliche Start-Kommando.
Versuch mal, nach 2 Sekunden den Befehl nochmal abzuschicken.
Welches Device hast du nochmal? Ich hab den i7, vielleicht gibts hier wieder mal Modellbezogene Eigenheiten.
Was anderes:
ich hab hier ein template File angehängt, das bei der Ersteinrichtung hilfreich ist, da es haufenweise copy/paste erspart.
Wenn man das nach
FHEM/lib/AttrTemplate/ kopiert, kann man beim MQTT2_DEVICE mit
set iRobotRoomba attrTemplate iRobotDevice auswählen.
Damit kriegt man dann im Web-UI als erstes eine Vorschau aller Attribute, die benötigt werden (setList, etc).
Klickt man dann
set muss man nur den nötigen Parameter angeben (die blid), und alle Attribute werden automatisch gesetzt.
Die Attribute zur Kartenerstellung sind hier noch nicht mit drin, kann ich aber bei Interesse gern noch dazugeben.
Der MQTT2_CLIENT devicetype unterstützt leider keine Attribute. Die nötigen Teile wären im Templatefile drin, das
set attrTemplate wird im UI aber nicht angezeigt.
schöne Grüße
Martin
? Soll ich das in das allg. m2-template-file integrieren und dann gleich noch den download der myUtils aus dem contrib mit reinpacken?
Das mit dem Client kann man so lösen, dass man es als attrTemplate mit passendem Filter nur auf ein M2-Device mit passendem model loslassen kann; dann muss man nur vorher sicherstellen, dass das "richtige" IO eingestellt ist (man könnte absichern, dass man das nur mit Devices des TYPE M2C kann...), die Attribute würden dann "quer" gesetzt... (Sowas gibt es schon mit den ignoreRegexp und auch die mehrkanaligen machen im Prinzip nichts anderes als "andere Devices" zu konfigurieren.)
Zitat von: Beta-User am 01 März 2021, 15:18:01
und auch die mehrkanaligen machen im Prinzip nichts anderes als "andere Devices" zu konfigurieren.
Könntest du mir da bitte ein Beispiel nennen und in welchem Template ich das finde? Davon lass ich mich gern inspirieren.
Zitat von: Beta-User am 01 März 2021, 15:18:01
? Soll ich das in das allg. m2-template-file integrieren und dann gleich noch den download der myUtils aus dem contrib mit reinpacken?
Die Frage geht, denk ich, nicht an mich. Ich weiß offen gestanden nicht, ob pah denkt, das hier alles ist schon stabil genug - meine Intepretation wäre eher, dass wir damit noch etwas warten sollten.
schöne Grüße
Martin
Zitat von: delMar am 01 März 2021, 16:25:17
Könntest du mir da bitte ein Beispiel nennen und in welchem Template ich das finde? Davon lass ich mich gern inspirieren.
"Einfaches" Beispiel:
tasmota_2channel_split
Ansonsten, falls du ZWave kennst: FGR223_Roller_Mode in zwave.template (das ist ein schönes Beispiel für Modularität, Nutzerabfragen und das begleitende Konfigurieren der Sprachsteuerung).
Für Freunde/Kenner von MQTT_GENERIC_BRIDGE gäbe es auch noch eine übersichtliche file, da wird auch das wenigste an der Bridge selbst gemacht...
Zitat
Die Frage geht, denk ich, nicht an mich. Ich weiß offen gestanden nicht, ob pah denkt, das hier alles ist schon stabil genug - meine Intepretation wäre eher, dass wir damit noch etwas warten sollten.
schöne Grüße
Martin
Mir ist das gleich; wäre nicht das erste "unfertige" template, kann man ja in der desc vermerken, wo man sich beschweren kann ;D .
Ein AttrTemplate habe ich auch schon in Arbeit, doppelte Arbeit sollten wir vermeiden. Abgesehen davon heißt es bei mir wie das Package: RoombaTemplate.
Ich habe das bisher noch nicht zur Verfügung gestellt, weil die RoombaUtils eben noch nicht stabil ist - insofern rate ich auch dazu, das mit dem Einbau in das m2-template noch aufzuschieben.
Beispiel für Instabilität: Das mit dem 2x Absenden des Start-Befehls. Dieser unerwünschte Effekt tritt bei mir auch auf, seitdem ich das Mission Management in ein Unterprogramm ausgelagert habe. Da muss ich noch etwas Gehirnschmalz hineinpacken.
Die bssid kann man natürlich auch bekommen. Einfach nach Zeile 376 in die Datei einfügen:
#-- getting events of the type
# # {"state":{"reported":{"netinfo":{""bssid":"44:.............:20"}}}}
my $bssid = $staterep->{'netinfo'}->{'bssid'};
$ret{"signalBssid"} = $bssid
if(defined($bssid));
Das Reading heißt signalBssid, damit es sich in der Device-Übersicht direkt vor der Signalstärke befindet. Es ist problemlos möglich, mit einem userReading
signalAP:signalBssid.* {((ReadingsVal('RoombaFeger','signalBssid','')=~/44.*20/)?'FritzBox':'Was Anderes')}
den Namen des AP dort einzusetzen (muss man natüriich noch tiefer schachteln, wenn es mehr als 2 AP sind).
LG
pah
Zitat von: delMar am 01 März 2021, 15:01:54
Die funktionieren bei mir immer noch. Allerdings ist mir auch aufgefallen, dass man seit einiger Zeit 2x den Befehl ausführen muss, damit der Robot dann auch wirklich loslegt.
Als ob beim ersten Mal der Connect hergestellt würde, und dann beim zweiten Mal erst das tatsächliche Start-Kommando.
Versuch mal, nach 2 Sekunden den Befehl nochmal abzuschicken.
Welches Device hast du nochmal?
schöne Grüße
Martin
Ich hab den E5. Vor den Utils könnte ich die webcmd mit <button> </button> aufhübschen. Damit wird anstelle des Ljnks ein Button angezeigt. Die funktionieren nun nicht mehr. Links gegen bei mir auch noch.
Gruß
Marco
Zitat von: Prof. Dr. Peter Henning am 01 März 2021, 19:53:43
Die bssid kann man natürlich auch bekommen. Einfach nach Zeile 376 in die Datei einfügen:
#-- getting events of the type
# # {"state":{"reported":{"netinfo":{""bssid":"44:.............:20"}}}}
my $bssid = $staterep->{'netinfo'}->{'bssid'};
$ret{"signalBssid"} = $bssid
if(defined($bssid));
Das Reading heißt signalBssid, damit es sich in der Device-Übersicht direkt vor der Signalstärke befindet. Es ist problemlos möglich, mit einem userReading
signalAP:signalBssid.* {((ReadingsVal('RoombaFeger','signalBssid','')=~/44.*20/)?'FritzBox':'Was Anderes')}
den Namen des AP dort einzusetzen (muss man natüriich noch tiefer schachteln, wenn es mehr als 2 AP sind).
Funktioniert einwandfrei. Danke!
lg, Gerhard
Hallo,
heute habe ich den folgenden Fehler in den log-Einträgen entdeckt.
Ich bin leider nicht früher drauf gekommen, weil ich immer nach anderen Einträgen gefiltert habe.
2021.03.02 08:54:39.392 3: MQTT2_DEVICE set myRoomba update
2021.03.02 08:54:42.404 4: MQTT2_DEVICE_Parse: myRoomba $aws/things/D6DBF1F7DA88458CBC34ED564C42DCD1/shadow/update => {roomba::reading($NAME,$EVENT)}
2021.03.02 08:54:42.429 1: ============> {"state":{"reported":{"batPct": 100, "batteryType": "F12432832R", "batInfo": {"mDate": "2019-4-16", "mName": "F12432832R", "mDaySerial": 32072, "mData": "303030333034303200000000000000000000000000", "mLife": "0C400B0A107E0C564DF7000C04F4F6C800CAFEB4290AFFFF000000C000000000", "cCount": 7, "afCount": 0}, "batAuthEnable": true, "bbchg": {"nChatters": 6, "nKnockoffs": 383, "nLithF": 26, "nChgOk": 424, "aborts": [5, 5, 5], "smberr": 57344}, "bbchg3": {"estCap": 1845, "nAvail": 871, "hOnDock": 6856, "avgMin": 64}, "bbmssn": {"aCycleM": 79, "nMssnF": 15, "nMssnC": 46, "nMssnOk": 410, "aMssnM": 150, "nMssn": 474}, "bbnav": {"aMtrack": 99, "nGoodLmrks": 0, "aGain": 21, "aExpo": 64}, "bbpause": {"pauses": [14, 2, 46, 2, 48, 38, 16, 101, 101, 101]}, "bbrun": {"nOvertemps": 0, "nCBump": 0, "nWStll": 0, "nMBStll": 8419, "nEvacs": 607, "nPanics": 897, "nPicks": 711, "nOpticalDD": 162, "nPiezoDD": 31, "nScrubs": 219, "nStuck": 207, "sqft": 2262, "min": 23, "hr": 412, "nCliffsF": 14956, "nCliffsR": 0}, "bbswitch": {"nBumper": 345595, "nDrops": 1259, "nDock": 112, "nSpot": 87, "nClean": 334}, "bbsys": {"min": 58, "hr": 7639}, "behaviorFwk": true, "bin": {"present": true, "full": false}, "binPause": false, "bleDevLoc": false, "cap": {"binFullDetect": 2, "dockComm": 1, "wDevLoc": 2, "bleDevLoc": 0, "edge": 0, "maps": 3, "pmaps": 5, "tLine": 2, "area": 1, "eco": 1, "multiPass": 2, "pose": 1, "team": 1, "pp": 0, "lang": 2, "5ghz": 1, "prov": 3, "sched": 1, "svcConf": 1, "ota": 2, "log": 2, "langOta": 0, "tileScan": 1}, "carpetBoost": false, "cleanMissionStatus": {"cycle": "none", "phase": "charge", "expireM": 0, "rechrgM": 0, "error": 0, "notReady": 0, "mssnM": 0, "expireTm": 0, "rechrgTm": 0, "mssnStrtTm": 1614578460, "initiator": "manual", "nMssn": 474}, "cleanSchedule2": [], "cloudEnv": "prod", "connected": true, "country": "AT", "deploymentState": 0, "dock": {"known": true, "pn": null, "state": null, "id": null, "fwVer": null}, "evacAllowed": true, "ecoCharge": false, "hwPartsRev": {"csscID": 0, "mobBrd": 7, "mobBlid": "2B95EFC6E22DEDEC851C166B6918478E", "navSerialNo": "CF09209PV", "wlan0HwAddr": "50:14:79:04:27:22", "NavBrd": 0}, "hwDbgr": {"swVer": "", "hw": "", "status": 0}, "langs": null, "langs2": {"sVer": "1.0", "dLangs": {"ver": "0.20", "langs": ["cs-CZ", "da-DK", "de-DE", "en-GB", "en-US", "es-ES", "es-XL", "fi-FI", "fr-CA", "fr-FR", "he-IL", "it-IT", "ja-JP", "ko-KR", "nb-NO", "nl-NL", "pl-PL", "pt-BR", "pt-PT", "ru-RU", "sv-SE", "zh-CN", "zh-HK", "zh-TW"]}, "sLang": "de-DE", "aSlots": 0}, "language": null, "lastCommand": {"command": "dock", "initiator": "manual", "time": 1614578625}, "lastDisconnect": 2, "mapUploadAllowed": true, "missionTelemetry": {"aux_comms": 1, "bat_stats": 1, "camera_settings": 1, "map_hypotheses": 1, "map_load": 1, "vital_stats": 1, "vslam_report": 1}, "mssnNavStats": {"nMssn": 474, "gLmk": 0, "lmk": 0, "reLc": 0, "plnErr": "none", "mTrk": 99, "kdp": 0, "sfkdp": 0, "nmc": 7, "nmmc": 0, "nrmc": 1, "mpSt": "idle", "l_drift": 0, "h_drift": 0, "l_squal": 0, "h_squal": 0}, "name": "Roomba", "noAutoPasses": false, "noPP": false, "openOnly": false, "pmapLearningAllowed": true, "pmaps": [{"Qy6JsQPLQaC8cqDAnPARpQ": "210219T212951"}, {"8iTvnlmpSnerXyAsKbRaag": "210228T153035"}, {"J2uFT80TTdKEiH43D7GdCw": "210221T103328"}, {"ZMLEee7KS6COwI2K73h8HA": "210221T103331"}, {"mRtGVa2WTvKiFO6Otr-gFQ": "210221T150855"}, {"rELbOvuZQ4yD3JhrLP9TCw": "210227T134434"}], "pmapCL": true, "pmapFmt": "3", "rankOverlap": 15, "reflexSettings": {"rlWheelDrop": {"enabled": 0}}, "sceneRecog": 1, "schedHold": false, "secureBoot": {"log": 2, "flip": 0, "sbl1Ver": "B3.2.0_PPUB", "stublVer": "B3.2.02_PPUB", "efuse": 1, "blType": 1, "enforce": 2, "lastRst": "200000000042", "recov": "linux+2.4.2+lewis-release-rt320+13", "idSwitch": 0}, "sku": "i755840", "softwareVer": "lewis+3.12.8+lewis-release-420+10", "subModSwVer": {"nav": "lewis-nav+3.12.8+ubuntu-HEAD-09318572a78+10", "mob": "3.12.8+ubuntu-HEAD-09318572a78+10", "pwr": "0.5.5+ubuntu-HEAD-09318572a78+10", "sft": "1.2.0+Lewis-Builds/Lewis-Certified-Safety/lewis-safety-ca6f27d09c6+31", "mobBtl": "4.0", "linux": "linux+3.8.0.2+lewis-release-420+10", "con": "3.8.61-@8419265a/ubuntu"}, "svcEndpoints": {"svcDeplId": "v007"}, "timezone": "Europe/Vienna", "tls": {"tzbChk": 1, "privKType": 2, "lcCiphers": [0, 0, 0, 0, 0, 0, 0, 50380848, 50331708, 50380847]}, "twoPass": false, "tz": {"events": [{"dt": 1604232000, "off": 60}, {"dt": 1616893201, "off": 120}, {"dt": 1635642001, "off": 60}], "ver": 9}, "vacHigh": false, "wDevLoc": false}}}
2021.03.02 08:54:42.431 1: [RoombaUtils] Device myRoomba hmUsrDock -> charge should start intialization
2021.03.02 08:54:42.716 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $EVTPART10= $evalSpecials->{'%EVTPART10'};my $EVTPART100= $evalSpecials->{'%EVTPART100'};my $EVTPART101= $evalSpecials->{'%EVTPART101'};my $EVTPART102= $evalSpecials->{'%EVTPART102'};my $EVTPART103= $evalSpecials->{'%EVTPART103'};my $EVTPART104= $evalSpecials->{'%EVTPART104'};my $EVTPART105= $evalSpecials->{'%EVTPART105'};my $EVTPART106= $evalSpecials->{'%EVTPART106'};my $EVTPART107= $evalSpecials->{'%EVTPART107'};my $EVTPART108= $evalSpecials->{'%EVTPART108'};my $EVTPART109= $evalSpecials->{'%EVTPART109'};my $EVTPART11= $evalSpecials->{'%EVTPART11'};my $EVTPART110= $evalSpecials->{'%EVTPART110'};my $EVTPART111= $evalSpecials->{'%EVTPART111'};my $EVTPART112= $evalSpecials->{'%EVTPART112'};my $EVTPART113= $evalSpecials->{'%EVTPART113'};my $EVTPART114= $evalSpecials->{'%EVTPART114'};my $EVTPART115= $evalSpecials->{'%EVTPART115'};my $EVTPART116= $evalSpecials->{'%EVTPART116'};my $EVTPART117= $evalSpecials->{'%EVTPART117'};my $EVTPART118= $evalSpecials->{'%EVTPART118'};my $EVTPART119= $evalSpecials->{'%EVTPART119'};my $EVTPART12= $evalSpecials->{'%EVTPART12'};my $EVTPART120= $evalSpecials->{'%EVTPART120'};my $EVTPART121= $evalSpecials->{'%EVTPART121'};my $EVTPART122= $evalSpecials->{'%EVTPART122'};my $EVTPART123= $evalSpecials->{'%EVTPART123'};my $EVTPART124= $evalSpecials->{'%EVTPART124'};my $EVTPART125= $evalSpecials->{'%EVTPART125'};my $EVTPART126= $evalSpecials->{'%EVTPART126'};my $EVTPART127= $evalSpecials->{'%EVTPART127'};my $EVTPART128= $evalSpecials->{'%EVTPART128'};my $EVTPART129= $evalSpecials->{'%EVTPART129'};my $EVTPART13= $evalSpecials->{'%EVTPART13'};my $EVTPART130= $evalSpecials->{'%EVTPART130'};my $EVTPART131= $evalSpecials->{'%EVTPART131'};my $EVTPART132= $evalSpecials->{'%EVTPART132'};my $EVTPART133= $evalSpecials->{'%EVTPART133'};my $EVTPART134= $evalSpecials->{'%EVTPART134'};my $EVTPART135= $evalSpecials->{'%EVTPART135'};my $EVTPART136= $evalSpecials->{'%EVTPART136'};my $EVTPART137= $evalSpecials->{'%EVTPART137'};my $EVTPART138= $evalSpecials->{'%EVTPART138'};my $EVTPART139= $evalSpecials->{'%EVTPART139'};my $EVTPART14= $evalSpecials->{'%EVTPART14'};my $EVTPART140= $evalSpecials->{'%EVTPART140'};my $EVTPART141= $evalSpecials->{'%EVTPART141'};my $EVTPART142= $evalSpecials->{'%EVTPART142'};my $EVTPART143= $evalSpecials->{'%EVTPART143'};my $EVTPART144= $evalSpecials->{'%EVTPART144'};my $EVTPART145= $evalSpecials->{'%EVTPART145'};my $EVTPART146= $evalSpecials->{'%EVTPART146'};my $EVTPART147= $evalSpecials->{'%EVTPART147'};my $EVTPART148= $evalSpecials->{'%EVTPART148'};my $EVTPART149= $evalSpecials->{'%EVTPART149'};my $EVTPART15= $evalSpecials->{'%EVTPART15'};my $EVTPART150= $evalSpecials->{'%EVTPART150'};my $EVTPART151= $evalSpecials->{'%EVTPART151'};my $EVTPART152= $evalSpecials->{'%EVTPART152'};my $EVTPART153= $evalSpecials->{'%EVTPART153'};my $EVTPART154= $evalSpecials->{'%EVTPART154'};my $EVTPART155= $evalSpecials->{'%EVTPART155'};my $EVTPART156= $evalSpecials->{'%EVTPART156'};my $EVTPART157= $evalSpecials->{'%EVTPART157'};my $EVTPART158= $evalSpecials->{'%EVTPART158'};my $EVTPART159= $evalSpecials->{'%EVTPART159'};my $EVTPART16= $evalSpecials->{'%EVTPART16'};my $EVTPART160= $evalSpecials->{'%EVTPART160'};my $EVTPART161= $evalSpecials->{'%EVTPART161'};my $EVTPART162= $evalSpecials->{'%EVTPART162'};my $EVTPART163= $evalSpecials->{'%EVTPART163'};my $EVTPART164= $evalSpecials->{'%EVTPART164'};my $EVTPART165= $evalSpecials->{'%EVTPART165'};my $EVTPART166= $evalSpecials->{'%EVTPART166'};my $EVTPART167= $evalSpecials->{'%EVTPART167'};my $EVTPART168= $evalSpecials->{'%EVTPART168'};my $EVTPART169= $evalSpecials->{'%EVTPART169'};my $EVTPART17= $evalSpecials->{'%EVTPART17'};my $EVTPART170= $evalSpecials->{'%EVTPART170'};my $EVTPART171= $evalSpecials->{'%EVTPART171'};my $EVTPART172= $evalSpecials->{'%EVTPART172'};my $EVTPART173= $evalSpecials->{'%EVTPART173'};my $EVTPART174= $evalSpecials->{'%EVTPART174'};my $EVTPART175= $evalSpecials->{'%EVTPART175'};my $EVTPART176= $evalSpecials->{'%EVTPART176'};my $EVTPART177= $evalSpecials->{'%EVTPART177'};my $EVTPART178= $evalSpecials->{'%EVTPART178'};my $EVTPART179= $evalSpecials->{'%EVTPART179'};my $EVTPART18= $evalSpecials->{'%EVTPART18'};my $EVTPART180= $evalSpecials->{'%EVTPART180'};my $EVTPART181= $evalSpecials->{'%EVTPART181'};my $EVTPART182= $evalSpecials->{'%EVTPART182'};my $EVTPART183= $evalSpecials->{'%EVTPART183'};my $EVTPART184= $evalSpecials->{'%EVTPART184'};my $EVTPART185= $evalSpecials->{'%EVTPART185'};my $EVTPART186= $evalSpecials->{'%EVTPART186'};my $EVTPART187= $evalSpecials->{'%EVTPART187'};my $EVTPART188= $evalSpecials->{'%EVTPART188'};my $EVTPART189= $evalSpecials->{'%EVTPART189'};my $EVTPART19= $evalSpecials->{'%EVTPART19'};my $EVTPART190= $evalSpecials->{'%EVTPART190'};my $EVTPART191= $evalSpecials->{'%EVTPART191'};my $EVTPART192= $evalSpecials->{'%EVTPART192'};my $EVTPART193= $evalSpecials->{'%EVTPART193'};my $EVTPART194= $evalSpecials->{'%EVTPART194'};my $EVTPART195= $evalSpecials->{'%EVTPART195'};my $EVTPART196= $evalSpecials->{'%EVTPART196'};my $EVTPART197= $evalSpecials->{'%EVTPART197'};my $EVTPART198= $evalSpecials->{'%EVTPART198'};my $EVTPART199= $evalSpecials->{'%EVTPART199'};my $EVTPART2= $evalSpecials->{'%EVTPART2'};my $EVTPART20= $evalSpecials->{'%EVTPART20'};my $EVTPART200= $evalSpecials->{'%EVTPART200'};my $EVTPART201= $evalSpecials->{'%EVTPART201'};my $EVTPART202= $evalSpecials->{'%EVTPART202'};my $EVTPART203= $evalSpecials->{'%EVTPART203'};my $EVTPART204= $evalSpecials->{'%EVTPART204'};my $EVTPART205= $evalSpecials->{'%EVTPART205'};my $EVTPART206= $evalSpecials->{'%EVTPART206'};my $EVTPART207= $evalSpecials->{'%EVTPART207'};my $EVTPART208= $evalSpecials->{'%EVTPART208'};my $EVTPART209= $evalSpecials->{'%EVTPART209'};my $EVTPART21= $evalSpecials->{'%EVTPART21'};my $EVTPART210= $evalSpecials->{'%EVTPART210'};my $EVTPART211= $evalSpecials->{'%EVTPART211'};my $EVTPART212= $evalSpecials->{'%EVTPART212'};my $EVTPART213= $evalSpecials->{'%EVTPART213'};my $EVTPART214= $evalSpecials->{'%EVTPART214'};my $EVTPART215= $evalSpecials->{'%EVTPART215'};my $EVTPART216= $evalSpecials->{'%EVTPART216'};my $EVTPART217= $evalSpecials->{'%EVTPART217'};my $EVTPART218= $evalSpecials->{'%EVTPART218'};my $EVTPART219= $evalSpecials->{'%EVTPART219'};my $EVTPART22= $evalSpecials->{'%EVTPART22'};my $EVTPART220= $evalSpecials->{'%EVTPART220'};my $EVTPART221= $evalSpecials->{'%EVTPART221'};my $EVTPART222= $evalSpecials->{'%EVTPART222'};my $EVTPART223= $evalSpecials->{'%EVTPART223'};my $EVTPART224= $evalSpecials->{'%EVTPART224'};my $EVTPART225= $evalSpecials->{'%EVTPART225'};my $EVTPART226= $evalSpecials->{'%EVTPART226'};my $EVTPART227= $evalSpecials->{'%EVTPART227'};my $EVTPART228= $evalSpecials->{'%EVTPART228'};my $EVTPART229= $evalSpecials->{'%EVTPART229'};my $EVTPART23= $evalSpecials->{'%EVTPART23'};my $EVTPART230= $evalSpecials->{'%EVTPART230'};my $EVTPART231= $evalSpecials->{'%EVTPART231'};my $EVTPART232= $evalSpecials->{'%EVTPART232'};my $EVTPART233= $evalSpecials->{'%EVTPART233'};my $EVTPART234= $evalSpecials->{'%EVTPART234'};my $EVTPART235= $evalSpecials->{'%EVTPART235'};my $EVTPART236= $evalSpecials->{'%EVTPART236'};my $EVTPART237= $evalSpecials->{'%EVTPART237'};my $EVTPART238= $evalSpecials->{'%EVTPART238'};my $EVTPART239= $evalSpecials->{'%EVTPART239'};my $EVTPART24= $evalSpecials->{'%EVTPART24'};my $EVTPART240= $evalSpecials->{'%EVTPART240'};my $EVTPART241= $evalSpecials->{'%EVTPART241'};my $EVTPART242= $evalSpecials->{'%EVTPART242'};my $EVTPART243= $evalSpecials->{'%EVTPART243'};my $EVTPART244= $evalSpecials->{'%EVTPART244'};my $EVTPART245= $evalSpecials->{'%EVTPART245'};my $EVTPART246= $evalSpecials->{'%EVTPART246'};my $EVTPART247= $evalSpecials->{'%EVTPART247'};my $EVTPART248= $evalSpecials->{'%EVTPART248'};my $EVTPART249= $evalSpecials->{'%EVTPART249'};my $EVTPART25= $evalSpecials->{'%EVTPART25'};my $EVTPART250= $evalSpecials->{'%EVTPART250'};my $EVTPART251= $evalSpecials->{'%EVTPART251'};my $EVTPART252= $evalSpecials->{'%EVTPART252'};my $EVTPART253= $evalSpecials->{'%EVTPART253'};my $EVTPART254= $evalSpecials->{'%EVTPART254'};my $EVTPART255= $evalSpecials->{'%EVTPART255'};my $EVTPART256= $evalSpecials->{'%EVTPART256'};my $EVTPART257= $evalSpecials->{'%EVTPART257'};my $EVTPART258= $evalSpecials->{'%EVTPART258'};my $EVTPART259= $evalSpecials->{'%EVTPART259'};my $EVTPART26= $evalSpecials->{'%EVTPART26'};my $EVTPART260= $evalSpecials->{'%EVTPART260'};my $EVTPART261= $evalSpecials->{'%EVTPART261'};my $EVTPART262= $evalSpecials->{'%EVTPART262'};my $EVTPART263= $evalSpecials->{'%EVTPART263'};my $EVTPART264= $evalSpecials->{'%EVTPART264'};my $EVTPART265= $evalSpecials->{'%EVTPART265'};my $EVTPART266= $evalSpecials->{'%EVTPART266'};my $EVTPART267= $evalSpecials->{'%EVTPART267'};my $EVTPART268= $evalSpecials->{'%EVTPART268'};my $EVTPART269= $evalSpecials->{'%EVTPART269'};my $EVTPART27= $evalSpecials->{'%EVTPART27'};my $EVTPART270= $evalSpecials->{'%EVTPART270'};my $EVTPART271= $evalSpecials->{'%EVTPART271'};my $EVTPART272= $evalSpecials->{'%EVTPART272'};my $EVTPART273= $evalSpecials->{'%EVTPART273'};my $EVTPART274= $evalSpecials->{'%EVTPART274'};my $EVTPART275= $evalSpecials->{'%EVTPART275'};my $EVTPART276= $evalSpecials->{'%EVTPART276'};my $EVTPART277= $evalSpecials->{'%EVTPART277'};my $EVTPART278= $evalSpecials->{'%EVTPART278'};my $EVTPART279= $evalSpecials->{'%EVTPART279'};my $EVTPART28= $evalSpecials->{'%EVTPART28'};my $EVTPART280= $evalSpecials->{'%EVTPART280'};my $EVTPART281= $evalSpecials->{'%EVTPART281'};my $EVTPART282= $evalSpecials->{'%EVTPART282'};my $EVTPART283= $evalSpecials->{'%EVTPART283'};my $EVTPART284= $evalSpecials->{'%EVTPART284'};my $EVTPART285= $evalSpecials->{'%EVTPART285'};my $EVTPART286= $evalSpecials->{'%EVTPART286'};my $EVTPART287= $evalSpecials->{'%EVTPART287'};my $EVTPART288= $evalSpecials->{'%EVTPART288'};my $EVTPART289= $evalSpecials->{'%EVTPART289'};my $EVTPART29= $evalSpecials->{'%EVTPART29'};my $EVTPART290= $evalSpecials->{'%EVTPART290'};my $EVTPART291= $evalSpecials->{'%EVTPART291'};my $EVTPART292= $evalSpecials->{'%EVTPART292'};my $EVTPART293= $evalSpecials->{'%EVTPART293'};my $EVTPART294= $evalSpecials->{'%EVTPART294'};my $EVTPART295= $evalSpecials->{'%EVTPART295'};my $EVTPART296= $evalSpecials->{'%EVTPART296'};my $EVTPART297= $evalSpecials->{'%EVTPART297'};my $EVTPART298= $evalSpecials->{'%EVTPART298'};my $EVTPART299= $evalSpecials->{'%EVTPART299'};my $EVTPART3= $evalSpecials->{'%EVTPART3'};my $EVTPART30= $evalSpecials->{'%EVTPART30'};my $EVTPART300= $evalSpecials->{'%EVTPART300'};my $EVTPART301= $evalSpecials->{'%EVTPART301'};my $EVTPART302= $evalSpecials->{'%EVTPART302'};my $EVTPART303= $evalSpecials->{'%EVTPART303'};my $EVTPART304= $evalSpecials->{'%EVTPART304'};my $EVTPART305= $evalSpecials->{'%EVTPART305'};my $EVTPART306= $evalSpecials->{'%EVTPART306'};my $EVTPART307= $evalSpecials->{'%EVTPART307'};my $EVTPART308= $evalSpecials->{'%EVTPART308'};my $EVTPART309= $evalSpecials->{'%EVTPART309'};my $EVTPART31= $evalSpecials->{'%EVTPART31'};my $EVTPART310= $evalSpecials->{'%EVTPART310'};my $EVTPART311= $evalSpecials->{'%EVTPART311'};my $EVTPART312= $evalSpecials->{'%EVTPART312'};my $EVTPART313= $evalSpecials->{'%EVTPART313'};my $EVTPART314= $evalSpecials->{'%EVTPART314'};my $EVTPART315= $evalSpecials->{'%EVTPART315'};my $EVTPART316= $evalSpecials->{'%EVTPART316'};my $EVTPART317= $evalSpecials->{'%EVTPART317'};my $EVTPART318= $evalSpecials->{'%EVTPART318'};my $EVTPART319= $evalSpecials->{'%EVTPART319'};my $EVTPART32= $evalSpecials->{'%EVTPART32'};my $EVTPART320= $evalSpecials->{'%EVTPART320'};my $EVTPART321= $evalSpecials->{'%EVTPART321'};my $EVTPART322= $evalSpecials->{'%EVTPART322'};my $EVTPART323= $evalSpecials->{'%EVTPART323'};my $EVTPART324= $evalSpecials->{'%EVTPART324'};my $EVTPART325= $evalSpecials->{'%EVTPART325'};my $EVTPART326= $evalSpecials->{'%EVTPART326'};my $EVTPART327= $evalSpecials->{'%EVTPART327'};my $EVTPART328= $evalSpecials->{'%EVTPART328'};my $EVTPART329= $evalSpecials->{'%EVTPART329'};my $EVTPART33= $evalSpecials->{'%EVTPART33'};my $EVTPART330= $evalSpecials->{'%EVTPART330'};my $EVTPART331= $evalSpecials->{'%EVTPART331'};my $EVTPART332= $evalSpecials->{'%EVTPART332'};my $EVTPART333= $evalSpecials->{'%EVTPART333'};my $EVTPART334= $evalSpecials->{'%EVTPART334'};my $EVTPART335= $evalSpecials->{'%EVTPART335'};my $EVTPART336= $evalSpecials->{'%EVTPART336'};my $EVTPART337= $evalSpecials->{'%EVTPART337'};my $EVTPART338= $evalSpecials->{'%EVTPART338'};my $EVTPART339= $evalSpecials->{'%EVTPART339'};my $EVTPART34= $evalSpecials->{'%EVTPART34'};my $EVTPART340= $evalSpecials->{'%EVTPART340'};my $EVTPART341= $evalSpecials->{'%EVTPART341'};my $EVTPART342= $evalSpecials->{'%EVTPART342'};my $EVTPART343= $evalSpecials->{'%EVTPART343'};my $EVTPART344= $evalSpecials->{'%EVTPART344'};my $EVTPART345= $evalSpecials->{'%EVTPART345'};my $EVTPART346= $evalSpecials->{'%EVTPART346'};my $EVTPART347= $evalSpecials->{'%EVTPART347'};my $EVTPART348= $evalSpecials->{'%EVTPART348'};my $EVTPART349= $evalSpecials->{'%EVTPART349'};my $EVTPART35= $evalSpecials->{'%EVTPART35'};my $EVTPART350= $evalSpecials->{'%EVTPART350'};my $EVTPART351= $evalSpecials->{'%EVTPART351'};my $EVTPART352= $evalSpecials->{'%EVTPART352'};my $EVTPART353= $evalSpecials->{'%EVTPART353'};my $EVTPART354= $evalSpecials->{'%EVTPART354'};my $EVTPART355= $evalSpecials->{'%EVTPART355'};my $EVTPART356= $evalSpecials->{'%EVTPART356'};my $EVTPART357= $evalSpecials->{'%EVTPART357'};my $EVTPART358= $evalSpecials->{'%EVTPART358'};my $EVTPART359= $evalSpecials->{'%EVTPART359'};my $EVTPART36= $evalSpecials->{'%EVTPART36'};my $EVTPART360= $evalSpecials->{'%EVTPART360'};my $EVTPART361= $evalSpecials->{'%EVTPART361'};my $EVTPART362= $evalSpecials->{'%EVTPART362'};my $EVTPART363= $evalSpecials->{'%EVTPART363'};my $EVTPART364= $evalSpecials->{'%EVTPART364'};my $EVTPART365= $evalSpecials->{'%EVTPART365'};my $EVTPART366= $evalSpecials->{'%EVTPART366'};my $EVTPART367= $evalSpecials->{'%EVTPART367'};my $EVTPART368= $evalSpecials->{'%EVTPART368'};my $EVTPART369= $evalSpecials->{'%EVTPART369'};my $EVTPART37= $evalSpecials->{'%EVTPART37'};my $EVTPART370= $evalSpecials->{'%EVTPART370'};my $EVTPART371= $evalSpecials->{'%EVTPART371'};my $EVTPART372= $evalSpecials->{'%EVTPART372'};my $EVTPART373= $evalSpecials->{'%EVTPART373'};my $EVTPART374= $evalSpecials->{'%EVTPART374'};my $EVTPART375= $evalSpecials->{'%EVTPART375'};my $EVTPART376= $evalSpecials->{'%EVTPART376'};my $EVTPART377= $evalSpecials->{'%EVTPART377'};my $EVTPART378= $evalSpecials->{'%EVTPART378'};my $EVTPART379= $evalSpecials->{'%EVTPART379'};my $EVTPART38= $evalSpecials->{'%EVTPART38'};my $EVTPART380= $evalSpecials->{'%EVTPART380'};my $EVTPART381= $evalSpecials->{'%EVTPART381'};my $EVTPART382= $evalSpecials->{'%EVTPART382'};my $EVTPART383= $evalSpecials->{'%EVTPART383'};my $EVTPART384= $evalSpecials->{'%EVTPART384'};my $EVTPART385= $evalSpecials->{'%EVTPART385'};my $EVTPART386= $evalSpecials->{'%EVTPART386'};my $EVTPART387= $evalSpecials->{'%EVTPART387'};my $EVTPART388= $evalSpecials->{'%EVTPART388'};my $EVTPART389= $evalSpecials->{'%EVTPART389'};my $EVTPART39= $evalSpecials->{'%EVTPART39'};my $EVTPART390= $evalSpecials->{'%EVTPART390'};my $EVTPART391= $evalSpecials->{'%EVTPART391'};my $EVTPART392= $evalSpecials->{'%EVTPART392'};my $EVTPART393= $evalSpecials->{'%EVTPART393'};my $EVTPART394= $evalSpecials->{'%EVTPART394'};my $EVTPART395= $evalSpecials->{'%EVTPART395'};my $EVTPART396= $evalSpecials->{'%EVTPART396'};my $EVTPART397= $evalSpecials->{'%EVTPART397'};my $EVTPART398= $evalSpecials->{'%EVTPART398'};my $EVTPART399= $evalSpecials->{'%EVTPART399'};my $EVTPART4= $evalSpecials->{'%EVTPART4'};my $EVTPART40= $evalSpecials->{'%EVTPART40'};my $EVTPART400= $evalSpecials->{'%EVTPART400'};my $EVTPART401= $evalSpecials->{'%EVTPART401'};my $EVTPART402= $evalSpecials->{'%EVTPART402'};my $EVTPART403= $evalSpecials->{'%EVTPART403'};my $EVTPART404= $evalSpecials->{'%EVTPART404'};my $EVTPART405= $evalSpecials->{'%EVTPART405'};my $EVTPART406= $evalSpecials->{'%EVTPART406'};my $EVTPART407= $evalSpecials->{'%EVTPART407'};my $EVTPART408= $evalSpecials->{'%EVTPART408'};my $EVTPART409= $evalSpecials->{'%EVTPART409'};my $EVTPART41= $evalSpecials->{'%EVTPART41'};my $EVTPART410= $evalSpecials->{'%EVTPART410'};my $EVTPART411= $evalSpecials->{'%EVTPART411'};my $EVTPART412= $evalSpecials->{'%EVTPART412'};my $EVTPART413= $evalSpecials->{'%EVTPART413'};my $EVTPART414= $evalSpecials->{'%EVTPART414'};my $EVTPART415= $evalSpecials->{'%EVTPART415'};my $EVTPART416= $evalSpecials->{'%EVTPART416'};my $EVTPART417= $evalSpecials->{'%EVTPART417'};my $EVTPART418= $evalSpecials->{'%EVTPART418'};my $EVTPART419= $evalSpecials->{'%EVTPART419'};my $EVTPART42= $evalSpecials->{'%EVTPART42'};my $EVTPART420= $evalSpecials->{'%EVTPART420'};my $EVTPART421= $evalSpecials->{'%EVTPART421'};my $EVTPART422= $evalSpecials->{'%EVTPART422'};my $EVTPART423= $evalSpecials->{'%EVTPART423'};my $EVTPART424= $evalSpecials->{'%EVTPART424'};my $EVTPART425= $evalSpecials->{'%EVTPART425'};my $EVTPART426= $evalSpecials->{'%EVTPART426'};my $EVTPART427= $evalSpecials->{'%EVTPART427'};my $EVTPART428= $evalSpecials->{'%EVTPART428'};my $EVTPART429= $evalSpecials->{'%EVTPART429'};my $EVTPART43= $evalSpecials->{'%EVTPART43'};my $EVTPART430= $evalSpecials->{'%EVTPART430'};my $EVTPART431= $evalSpecials->{'%EVTPART431'};my $EVTPART432= $evalSpecials->{'%EVTPART432'};my $EVTPART433= $evalSpecials->{'%EVTPART433'};my $EVTPART434= $evalSpecials->{'%EVTPART434'};my $EVTPART435= $evalSpecials->{'%EVTPART435'};my $EVTPART436= $evalSpecials->{'%EVTPART436'};my $EVTPART437= $evalSpecials->{'%EVTPART437'};my $EVTPART438= $evalSpecials->{'%EVTPART438'};my $EVTPART439= $evalSpecials->{'%EVTPART439'};my $EVTPART44= $evalSpecials->{'%EVTPART44'};my $EVTPART440= $evalSpecials->{'%EVTPART440'};my $EVTPART441= $evalSpecials->{'%EVTPART441'};my $EVTPART442= $evalSpecials->{'%EVTPART442'};my $EVTPART443= $evalSpecials->{'%EVTPART443'};my $EVTPART444= $evalSpecials->{'%EVTPART444'};my $EVTPART445= $evalSpecials->{'%EVTPART445'};my $EVTPART446= $evalSpecials->{'%EVTPART446'};my $EVTPART447= $evalSpecials->{'%EVTPART447'};my $EVTPART448= $evalSpecials->{'%EVTPART448'};my $EVTPART449= $evalSpecials->{'%EVTPART449'};my $EVTPART45= $evalSpecials->{'%EVTPART45'};my $EVTPART450= $evalSpecials->{'%EVTPART450'};my $EVTPART451= $evalSpecials->{'%EVTPART451'};my $EVTPART452= $evalSpecials->{'%EVTPART452'};my $EVTPART453= $evalSpecials->{'%EVTPART453'};my $EVTPART454= $evalSpecials->{'%EVTPART454'};my $EVTPART455= $evalSpecials->{'%EVTPART455'};my $EVTPART456= $evalSpecials->{'%EVTPART456'};my $EVTPART457= $evalSpecials->{'%EVTPART457'};my $EVTPART458= $evalSpecials->{'%EVTPART458'};my $EVTPART459= $evalSpecials->{'%EVTPART459'};my $EVTPART46= $evalSpecials->{'%EVTPART46'};my $EVTPART460= $evalSpecials->{'%EVTPART460'};my $EVTPART461= $evalSpecials->{'%EVTPART461'};my $EVTPART462= $evalSpecials->{'%EVTPART462'};my $EVTPART463= $evalSpecials->{'%EVTPART463'};my $EVTPART464= $evalSpecials->{'%EVTPART464'};my $EVTPART465= $evalSpecials->{'%EVTPART465'};my $EVTPART466= $evalSpecials->{'%EVTPART466'};my $EVTPART467= $evalSpecials->{'%EVTPART467'};my $EVTPART468= $evalSpecials->{'%EVTPART468'};my $EVTPART469= $evalSpecials->{'%EVTPART469'};my $EVTPART47= $evalSpecials->{'%EVTPART47'};my $EVTPART470= $evalSpecials->{'%EVTPART470'};my $EVTPART471= $evalSpecials->{'%EVTPART471'};my $EVTPART472= $evalSpecials->{'%EVTPART472'};my $EVTPART473= $evalSpecials->{'%EVTPART473'};my $EVTPART474= $evalSpecials->{'%EVTPART474'};my $EVTPART475= $evalSpecials->{'%EVTPART475'};my $EVTPART48= $evalSpecials->{'%EVTPART48'};my $EVTPART49= $evalSpecials->{'%EVTPART49'};my $EVTPART5= $evalSpecials->{'%EVTPART5'};my $EVTPART50= $evalSpecials->{'%EVTPART50'};my $EVTPART51= $evalSpecials->{'%EVTPART51'};my $EVTPART52= $evalSpecials->{'%EVTPART52'};my $EVTPART53= $evalSpecials->{'%EVTPART53'};my $EVTPART54= $evalSpecials->{'%EVTPART54'};my $EVTPART55= $evalSpecials->{'%EVTPART55'};my $EVTPART56= $evalSpecials->{'%EVTPART56'};my $EVTPART57= $evalSpecials->{'%EVTPART57'};my $EVTPART58= $evalSpecials->{'%EVTPART58'};my $EVTPART59= $evalSpecials->{'%EVTPART59'};my $EVTPART6= $evalSpecials->{'%EVTPART6'};my $EVTPART60= $evalSpecials->{'%EVTPART60'};my $EVTPART61= $evalSpecials->{'%EVTPART61'};my $EVTPART62= $evalSpecials->{'%EVTPART62'};my $EVTPART63= $evalSpecials->{'%EVTPART63'};my $EVTPART64= $evalSpecials->{'%EVTPART64'};my $EVTPART65= $evalSpecials->{'%EVTPART65'};my $EVTPART66= $evalSpecials->{'%EVTPART66'};my $EVTPART67= $evalSpecials->{'%EVTPART67'};my $EVTPART68= $evalSpecials->{'%EVTPART68'};my $EVTPART69= $evalSpecials->{'%EVTPART69'};my $EVTPART7= $evalSpecials->{'%EVTPART7'};my $EVTPART70= $evalSpecials->{'%EVTPART70'};my $EVTPART71= $evalSpecials->{'%EVTPART71'};my $EVTPART72= $evalSpecials->{'%EVTPART72'};my $EVTPART73= $evalSpecials->{'%EVTPART73'};my $EVTPART74= $evalSpecials->{'%EVTPART74'};my $EVTPART75= $evalSpecials->{'%EVTPART75'};my $EVTPART76= $evalSpecials->{'%EVTPART76'};my $EVTPART77= $evalSpecials->{'%EVTPART77'};my $EVTPART78= $evalSpecials->{'%EVTPART78'};my $EVTPART79= $evalSpecials->{'%EVTPART79'};my $EVTPART8= $evalSpecials->{'%EVTPART8'};my $EVTPART80= $evalSpecials->{'%EVTPART80'};my $EVTPART81= $evalSpecials->{'%EVTPART81'};my $EVTPART82= $evalSpecials->{'%EVTPART82'};my $EVTPART83= $evalSpecials->{'%EVTPART83'};my $EVTPART84= $evalSpecials->{'%EVTPART84'};my $EVTPART85= $evalSpecials->{'%EVTPART85'};my $EVTPART86= $evalSpecials->{'%EVTPART86'};my $EVTPART87= $evalSpecials->{'%EVTPART87'};my $EVTPART88= $evalSpecials->{'%EVTPART88'};my $EVTPART89= $evalSpecials->{'%EVTPART89'};my $EVTPART9= $evalSpecials->{'%EVTPART9'};my $EVTPART90= $evalSpecials->{'%EVTPART90'};my $EVTPART91= $evalSpecials->{'%EVTPART91'};my $EVTPART92= $evalSpecials->{'%EVTPART92'};my $EVTPART93= $evalSpecials->{'%EVTPART93'};my $EVTPART94= $evalSpecials->{'%EVTPART94'};my $EVTPART95= $evalSpecials->{'%EVTPART95'};my $EVTPART96= $evalSpecials->{'%EVTPART96'};my $EVTPART97= $evalSpecials->{'%EVTPART97'};my $EVTPART98= $evalSpecials->{'%EVTPART98'};my $EVTPART99= $evalSpecials->{'%EVTPART99'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Can't use an undefined value as a HASH reference at ./FHEM/99_RoombaUtils.pm line 331.
Hat das sonst noch jemand?
lg, Gerhard
Zitat von: Prof. Dr. Peter Henning am 01 März 2021, 19:53:43
Ein AttrTemplate habe ich auch schon in Arbeit, doppelte Arbeit sollten wir vermeiden. Abgesehen davon heißt es bei mir wie das Package: RoombaTemplate.
Ich habe das bisher noch nicht zur Verfügung gestellt, weil die RoombaUtils eben noch nicht stabil ist - insofern rate ich auch dazu, das mit dem Einbau in das m2-template noch aufzuschieben.
Kein Ding, bitte melden, wenn ich aktiv werden soll...
Hallo,
mit der neuen Version der 99_RoombaUtils bekomme ich beim Laden (reload 99_RoombaUtils.pm) folgende Fehlermeldungen:
Too many arguments for roomba::mission at ./FHEM/99_RoombaUtils.pm line 326, near "%ret)"
Too many arguments for roomba::schedule at ./FHEM/99_RoombaUtils.pm line 332, near "%ret)"
Mach ich was falsch?
LG,
Hermann
Hallo Hermann,
das ist eigenartig. Die Version wird bei mir zumindest einwandfrei geladen.
Bist Du sicher, dass Du die neueste Version hast?
https://forum.fhem.de/index.php/topic,114166.msg1135778.html#msg1135778 (https://forum.fhem.de/index.php/topic,114166.msg1135778.html#msg1135778)
Was steht denn bei Dir in den Zeilen 326 und 332?
#326 mission($name,\%mission,\%ret);
#332 schedule(\%cleans,\%ret);
lg, Gerhard
Hallo,
Danke für Deine Antwort!
Lösung gefunden (oder Bug entdeckt?): Offenbar lädt fhem bei "reload" das betreffende Modul nicht korrekt. Die betreffenden subroutinen hatten in der alten Version einen Übergabeparameter, in der neuen nun zwei ($$). fhem scheint genau das beim "reload" Befehl nicht neu einzulesen und geht weiter von nur einem Übergabeparameter aus. Wenn ich die Übergabeparameter auf einen reduziere, dann klappts nämlich. Bei einem restart liest fhem die 99_RoombaUtils.pm wohl komplett neu ein, inkl. Definition der subs, dann kommt der Fehler nicht mehr...Zumindets mein Nicht-Informatiker-Erklärungsversuch.
Danke fürs Gedanken machen!
Hermann
@hapege: Es ist immer eine große Freude und führt zur allgemeinen Zufriedenheit, wenn Newcomer gleich von einem "Bug" reden. ::) ::)
Die 99_RoombaUtils sind "Work in progress" - darum stehen sie auch im contrib-Ordner. Und da nehme ich mir die Freiheit, auch mal die Anzahl der Übergabeparameter zu ändern. Selbstverständlich wirft Perl dann eine Fehlermeldung aus, weil es bei einem einem einfachen Reload noch die alten sub-Definitionen kennt. Dann macht man eben mal einen Restart, fertig.
Ich werde jedenfalls nicht mit forward declarations arbeiten, um das zu verhindern.
pah
Hi,
sorry, ich wollte niemand zu nahe treten, mir war nicht transparent dass beim "reload" was anders passiert als beim fhem restart. Dass nur der Code der subs, aber nicht die Definition derselben neu gelesen wird hätte ich halt nicht angenommen. Kein Vorwurf oder Beschwerde Richtung der RoombaUtils, tut mir leid wenn Du das so verstanden hast. So "selbstverständlich" klar ist mir das nicht, aber ich bin auch kein Informatiker. Aber lernfähig, also wieder was dazugelernt, Danke!
LG,
Hermann
ZitatDass nur der Code der subs, aber nicht die Definition derselben neu gelesen wird hätte ich halt nicht angenommen
Nee, eben nicht. Umgekehrt: Es werden Aufrufe der Unterprogramme gelesen, obwohl diese (noch) mit anderer Parameterzahl im Speicher stehen und erst im weiterenVerlauf überschrieben werden. Um das zu vermeiden, müsste ich sie (temporär) _vor_ dem ersten Aufruf deklarieren, zumindest mit der aktuell gültigen Parameterzahl. Diese Mehrarbeit will ich mir aber gerne sparen.
LG
pah
Hallo,
@pah: Danke für die nette Erklärung!
Und weil ich mein neues Wissen überprüfen wollte, habe ich demzufolge einfach mal die Definition
sub testme ($$) { #tu was }
_vor_ den Aufruf
sub tesme (bla1, bla2)
gestellt, und - tataa, also korrekt verstanden - ich kann lustig Parameter hinzufügen oder wegnehmen, ohne dass beim reload eine Fehlermeldung kommt oder ein kompletter Restart nötig ist. QED :)
Vorsichtige Frage des Laien: Warum brauche ich die Parameter ($$) in der Definition der sub überhaupt, ein sub testme { #tu was } funktioniert auch, und da scheint es dann egal zu sein ob es im Code vor oder hinter dem Aufruf der sub steht...oder ist das unsauber?
(Bitte richtig verstehen, ich kritisiere nichts und will nicht klugscheissern, nur verstehen...)
Und weil ich so langsam ein bisschen verstehe was der Code "macht" habe ich mal eine kleine Ergänzung komponiert, die auch für den i7 die Schedules ausliest (/cleanSchedule/ gibts bei meinem i7 nicht, dafür ein anders aufgebautes array (?) /cleanSchedule2/), und bekomme damit in den Readings auch meine in der App konfigurierten Schedules (die App will ich eigentlich loswerden, ist aber wohl noch ein bisschen Weg dahin...). Was haltet ihr davon:
1) in der sub reading ergänzt:
if( $evt =~ /cleanSchedule2/){
my %cleans = %{$staterep};
scheduleI7(\%cleans,\%ret);
}
2) eine neue sub "scheduleI7" eingebaut:
#############################################################################
#
# schedule data for I7
#
#############################################################################
sub scheduleI7($$){
#-- getting events of the type
# {"state":{"reported":{"cleanSchedule2": [{"enabled": true, "type": 0,
# "start": {"day": [2, 4, 6], "hour": 11, "min": 0},
# "cmd": {"command": "start", "ordered": 1, "pmap_id": "xxxxxxxxxxxxx",
# "regions": [{"region_id": "10", "type": "rid"}, {"region_id": "6", "type": "rid"},
# {"region_id": "5", "type": "rid"}, {"region_id": "8", "type": "rid"}],
# "user_pmapv_id": "210220T092737"}}]}}}
#my ($dec) = @_;
my ($evtptr,$retptr) = @_;
my @weekdays = ("So","Mo","Di","Mi","Do","Fr","Sa");
my @enabled;
my @starthour;
my @startmin;
my @startday;
my @userpmapvid;
my @pmapid;
my $nsched;
my %answer = ();
for (my $i = 0; $i<4; $i++){
# j is needed since @startday does somehow not work with $i...
my $j = $i;
$nsched = $i+1;
$enabled[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'enabled'};
if(!defined($enabled[$i])) {
$retptr->{"NumOfSchedules"} = $i;
last;
}
$retptr->{"Schedule".$nsched."Enabled"} = booltoyesno($enabled[$i]) if(defined($enabled[$i]));
$starthour[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'start'}->{'hour'};
$startmin[$i] = sprintf("%02d", $evtptr->{'cleanSchedule2'}->[$i]->{'start'}->{'min'});
$retptr->{"Schedule".$nsched."Time"} = $starthour[$i].":".$startmin[$i] if(defined($starthour[$i]));
$userpmapvid[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'user_pmapv_id'};
$retptr->{"Schedule".$nsched."UserPMapvID"} = $userpmapvid[$i] if(defined($userpmapvid[$i]));
$pmapid[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'pmap_id'};
$retptr->{"Schedule".$nsched."PMapID"} = $pmapid[$i] if(defined($pmapid[$i]));
@startday = @{$evtptr->{'cleanSchedule2'}->[$j]->{'start'}->{'day'}};
for (@startday) {s/0/So/g;s/1/Mo/g;s/2/Di/g;s/3/Mi/g;s/4/Do/g;s/5/Fr/g;s/6/Sa/g;}
$retptr->{"Schedule".$nsched."WeekDays"} = join(",",@startday);
}
return
}
3) Damit bei den "ScheduleEnabled" statt 0/1 ein yes/no steht die Sektion helper um eine sub ergänzt (hauptsächlich copy & paste)
sub booltoyesno($){
my ($num) = @_;
my $ret = (($num==1)?"yes":"no");
#$ret = $num;
return $ret;
}
Was mich wurmt ist die brachiale Hilfsdefinition von "my $j = $i;" in der scheduleI7. Aber mit der eigentlichen Zählvariable "$i" funktioniert der folgende Aufruf nicht (geht nur wenn ich $j verwende)
@startday = @{$evtptr->{'cleanSchedule2'}->[$j]->{'start'}->{'day'}};
Was mache ich da falsch?
Und noch ein vermutlich unsauberes Konstrukt: Ich lese nur maximal 4 schedules in der for Schleife ein. Könnte man sicher auch als unbegrenzte Schleife mit der ja schon enthaltenen Abbruchbedingung lösen, aber ich wollte damit nicht riskieren bei Fehlern oder späteren API Änderungen in eine Endlosschleife stecken zu bleiben. Wie geht das besser?
Vielleicht ist das ja auch für andere nützlich und findet irgendwann bzw gerne verbessert (wie gesagt, ich bin kein Informatiker oder Perl Experte) mal Platz in den RoombaUtils.
LG,
Hermann
UPDATE 14.03.21:
ad 1) Beim Aufruf $name mit übergeben
if( $evt =~ /cleanSchedule2/){
my %cleans = %{$staterep};
scheduleI7($name,\%cleans,\%ret);
}
ad 2) Schleife auf 14 Schedules erweitert (empirisch ermittelte Maximalzahl der Zeitpläne im I7), Löschen alter Schedule Readings, wenn ein Zeitplan in der App wieder gelöscht wurde.
#############################################################################
#
# schedule data for I7
#
#############################################################################
sub scheduleI7($$$){
#-- getting events of the type
# {"state":{"reported":{"cleanSchedule2": [{"enabled": true, "type": 0,
# "start": {"day": [2, 4, 6], "hour": 11, "min": 0},
# "cmd": {"command": "start", "ordered": 1, "pmap_id": "zBzSo0ghQ-SYfM7yqTxZUg",
# "regions": [{"region_id": "10", "type": "rid"}, {"region_id": "6", "type": "rid"},
# {"region_id": "5", "type": "rid"}, {"region_id": "8", "type": "rid"}],
# "user_pmapv_id": "210220T092737"}}]}}}
#my ($dec) = @_;
my ($name,$evtptr,$retptr) = @_;
my @weekdays = ("So","Mo","Di","Mi","Do","Fr","Sa");
my @enabled;
my @starthour;
my @startmin;
my @startday;
my @userpmapvid;
my @pmapid;
my $nsched;
my %answer = ();
my $oldnsched = main::ReadingsVal($name,"NumOfSchedules","");
for (my $i = 0; $i<14; $i++){
# j is needed since @startday does somehow not work with $i...
my $j = $i;
$nsched = $i+1;
$enabled[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'enabled'};
# if schedules are no longer present in app or roomba, delete them in fhem, too
if(!defined($enabled[$i])) {
$retptr->{"NumOfSchedules"} = $i;
for (my $k = $i; $k < $oldnsched; $k++) {
main::Log 1,"[RoombaUtils] deleting old schedule ID $k, oldnsched No was $oldnsched";
my $hash = $main::defs{$name};
my $todel = $k+1;
main::readingsDelete($hash, "Schedule".$todel."Enabled");
main::readingsDelete($hash, "Schedule".$todel."Time");
main::readingsDelete($hash, "Schedule".$todel."UserPMapvID");
main::readingsDelete($hash, "Schedule".$todel."PMapID");
main::readingsDelete($hash, "Schedule".$todel."WeekDays");
}
last;
}
$retptr->{"Schedule".$nsched."Enabled"} = booltoyesno($enabled[$i]) if(defined($enabled[$i]));
$starthour[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'start'}->{'hour'};
$startmin[$i] = sprintf("%02d", $evtptr->{'cleanSchedule2'}->[$i]->{'start'}->{'min'});
$retptr->{"Schedule".$nsched."Time"} = $starthour[$i].":".$startmin[$i] if(defined($starthour[$i]));
$userpmapvid[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'user_pmapv_id'};
$retptr->{"Schedule".$nsched."UserPMapvID"} = $userpmapvid[$i] if(defined($userpmapvid[$i]));
$pmapid[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'pmap_id'};
$retptr->{"Schedule".$nsched."PMapID"} = $pmapid[$i] if(defined($pmapid[$i]));
@startday = @{$evtptr->{'cleanSchedule2'}->[$j]->{'start'}->{'day'}};
for (@startday) {s/0/So/g;s/1/Mo/g;s/2/Di/g;s/3/Mi/g;s/4/Do/g;s/5/Fr/g;s/6/Sa/g;}
$retptr->{"Schedule".$nsched."WeekDays"} = join(",",@startday);
}
return
}
(Ob readingsDelete auch mit regexp arbeiten kann, habe ich nicht herausfinden können...)
Hallo,
seit ein paar Tagen (ich denke, wahrscheinlich seit dem letzten Update), klappt bei mir das Einlesen des Ladestatus nicht mehr.
Es scheinen mehrere Events für die Batterie zu kommen:
2021.03.06 09:44:29.382 1: ============> {"state":{"reported":{"batPct": 16}}}
2021.03.06 09:56:41.666 1: ============> {"state":{"reported":{"batPct": 29}}}
2021.03.06 10:08:45.954 1: ============> {"state":{"reported":{"batPct": 42}}}
2021.03.06 10:20:50.537 1: ============> {"state":{"reported":{"batPct": 55}}}
2021.03.06 10:32:55.880 1: ============> {"state":{"reported":{"batPct": 68, "batteryType": "F12432832R", "batInfo": {"mDate": "2019-4-16", "mName": "F12432832R", "mDaySerial": 32072, "mData": "303030333034303200000000000000000000000000", "mLife": "0C400B0A107F0BF34DFA000E04F4F6C800CAFEB4290AFFFF0000013700000000", "cCount": 11, "afCount": 0}, "batAuthEnable": true, "bbchg": {"nChatters": 6, "nKnockoffs": 383, "nLithF": 26, "nChgOk": 426, "aborts": [5, 5, 5], "smberr": 57344}, "bbchg3": {"estCap": 1824, "nAvail": 875, "hOnDock": 6900, "avgMin": 61}, "bbmssn": {"aCycleM": 79, "nMssnF": 15, "nMssnC": 49, "nMssnOk": 412, "aMssnM": 150, "nMssn": 479}, "bbnav": {"aMtrack": 0, "nGoodLmrks": 0, "aGain": 0, "aExpo": 0}, "bbpause": {"pauses": [46, 46, 14, 2, 46, 2, 48, 38, 16, 101]}, "bbrun": {"nOvertemps": 0, "nCBump": 0, "nWStll": 0, "nMBStll": 8419, "nEvacs": 607, "nPanics": 908, "nPicks": 716, "nOpticalDD": 162, "nPiezoDD": 31, "nScrubs": 220, "nStuck": 209, "sqft": 2265, "min": 13, "hr": 413, "nCliffsF": 15212, "nCliffsR": 0}, "bbswitch": {"nBumper": 346891, "nDrops": 1280, "nDock": 113, "nSpot": 87, "nClean": 344}, "bbsys": {"min": 16, "hr": 7701}, "behaviorFwk": true, "bin": {"present": true, "full": false}, "binPause": true, "bleDevLoc": false, "cap": {"binFullDetect": 2, "dockComm": 1, "wDevLoc": 2, "bleDevLoc": 0, "edge": 0, "maps": 3, "pmaps": 5, "tLine": 2, "area": 1, "eco": 1, "multiPass": 2, "pose": 1, "team": 1, "pp": 0, "lang": 2, "5ghz": 1, "prov": 3, "sched": 1, "svcConf": 1, "ota": 2, "log": 2, "langOta": 0, "tileScan": 1}, "carpetBoost": false, "cleanMissionStatus": {"cycle": "none", "phase": "charge", "expireM": 0, "rechrgM": 0, "error": 0, "notReady": 0, "mssnM": 0, "expireTm": 0, "rechrgTm": 0, "mssnStrtTm": 0, "initiator": "none", "nMssn": 479}, "cleanSchedule2": [], "cloudEnv": "prod", "connected": true, "country": "AT", "deploymentState": 0, "dock": {"known": true, "pn": null, "state": null, "id": null, "fwVer": null}, "evacAllowed": true, "ecoCharge": false, "hwPartsRev": {"csscID": 0, "mobBrd": 7, "mobBlid": "2B95EFC6E22DEDEC851C166B6918478E", "navSerialNo": "CF09209PV", "wlan0HwAddr": "50:14:79:04:27:22", "NavBrd": 0}, "hwDbgr": {"swVer": "", "hw": "", "status": 0}, "langs": null, "langs2": {"sVer": "1.0", "dLangs": {"ver": "0.20", "langs": ["cs-CZ", "da-DK", "de-DE", "en-GB", "en-US", "es-ES", "es-XL", "fi-FI", "fr-CA", "fr-FR", "he-IL", "it-IT", "ja-JP", "ko-KR", "nb-NO", "nl-NL", "pl-PL", "pt-BR", "pt-PT", "ru-RU", "sv-SE", "zh-CN", "zh-HK", "zh-TW"]}, "sLang": "de-DE", "aSlots": 0}, "language": null, "lastCommand": {"command": null, "initiator": null, "time": null}, "lastDisconnect": 4, "mapUploadAllowed": true, "missionTelemetry": {"aux_comms": 1, "bat_stats": 1, "camera_settings": 1, "map_hypotheses": 1, "map_load": 1, "vital_stats": 1, "vslam_report": 1}, "name": "Roomba", "noAutoPasses": false, "noPP": false, "openOnly": false, "pmapLearningAllowed": true, "pmaps": [{"Qy6JsQPLQaC8cqDAnPARpQ": "210219T212951"}, {"8iTvnlmpSnerXyAsKbRaag": "210304T105450"}, {"J2uFT80TTdKEiH43D7GdCw": "210221T103328"}, {"ZMLEee7KS6COwI2K73h8HA": "210221T103331"}, {"mRtGVa2WTvKiFO6Otr-gFQ": "210221T150855"}, {"rELbOvuZQ4yD3JhrLP9TCw": "210303T113419"}], "pmapCL": true, "pmapFmt": "3", "rankOverlap": 15, "reflexSettings": {"rlWheelDrop": {"enabled": 0}}, "sceneRecog": 1, "schedHold": false, "secureBoot": {"log": 2, "flip": 0, "sbl1Ver": "B3.2.0_PPUB", "stublVer": "B3.2.02_PPUB", "efuse": 1, "blType": 1, "enforce": 2, "lastRst": "40", "recov": "linux+2.4.2+lewis-release-rt320+13", "idSwitch": 0}, "sku": "i755840", "softwareVer": "lewis+3.12.8+lewis-release-420+10", "subModSwVer": {"nav": "lewis-nav+3.12.8+ubuntu-HEAD-09318572a78+10", "mob": "3.12.8+ubuntu-HEAD-09318572a78+10", "pwr": "0.5.5+ubuntu-HEAD-09318572a78+10", "sft": "1.2.0+Lewis-Builds/Lewis-Certified-Safety/lewis-safety-ca6f27d09c6+31", "mobBtl": "4.0", "linux": "linux+3.8.0.2+lewis-release-420+10", "con": "3.8.61-@8419265a/ubuntu"}, "svcEndpoints": {"svcDeplId": "v007"}, "timezone": "Europe/Vienna", "tls": {"tzbChk": 1, "privKType": 2, "lcCiphers": [0, 0, 0, 0, 0, 0, 0, 50380848, 50331708, 50380847]}, "twoPass": false, "tz": {"events": [{"dt": 1604232000, "off": 60}, {"dt": 1616893201, "off": 120}, {"dt": 1635642001, "off": 60}], "ver": 9}, "vacHigh": false, "wDevLoc": false}}}
Also eine wo "nur" das "batPct" kommt und andere, die sehr viel detaillierter sind.
Die nur mit "batPct" funktionieren, sprich das Reading "battery" wird upgedatet; bei den anderen nicht.
In fhem wird "batPct" mit 55% und dem Zeitstempel "2021-03-06 10:20:50" angezeigt. So wie im Log zu sehen ist.
Hat das noch jemand?
lg, Gerhard
Hi,
hm, bis vor 10 Minuten hat das bei mir funktioniert auch mit der ausführlichen Message
{"state":{"reported":{"batPct": 100, "batteryType": "F12432832R", "batInfo": {....
Dann habe ich fhem aktualisiert - nun geht nix mehr. Im Log sehe ich nur
HttpUtils: 192.168.x.y: Connection refused (111)
Zwischen "klappt" und "nix geht mehr" lag nur das update...
LG,
Hermann
Hallo,
die Fehlermeldung "HttpUtils: 192.168.x.y: Connection refused (111)" kommt bei mir nicht.
Bin mir aber nicht sicher, ob das die Roomba-Utils überhaupt httpUtils verwenden.
lg, Gerhard
@hapege: Prima. Ich werde das gerne weitgehend übernehmen, testen müsste das dann nochjemand anders mit i7.
@gestein: Kommt mir seltsam vor - weil der Beginn mit state->reported immer das größere hash anlegt, in dem dann batPct gefüllt ist. Und wenn es gefüllt ist, wird auch ein Update gemacht.
Die httpUtils werden von MQTT2_DEVICE verwendet, der Fehler kommt also daher. Habe ich aber noch nicht gesehen.
LG
pah
Hm,
ich hab jetzt alles durchprobiert was ich hier so gefunden habe, also openssl erweitern
https://forum.fhem.de/index.php/topic,114166.msg1103514.html#msg1103514
Und Roomba zurücksetzen
https://forum.fhem.de/index.php/topic,114166.msg1128658.html#msg1128658
restart, reboot, apt update, die Kiste streicheln...
--> nada.
2021.03.07 11:57:29 4: IP: 192.168.x.y -> 192.168.x.y
2021.03.07 11:57:29 4: HttpUtils: 192.168.x.y: Connection refused (111)
Ratlosigkeit am Sonntag Morgen :(
@pah: "Weitgehend" klingt gut ;)
LG,
Hermann
Bitte zu diesem Fehler einen neuen Thread aufmachen, in diesem Unterforum hier, Titel "MQTT2_DEVICE mit httpUtils_Fehler".
LG
pah
Zitat von: Prof. Dr. Peter Henning am 07 März 2021, 11:50:08
@hapege: Prima. Ich werde das gerne weitgehend übernehmen, testen müsste das dann nochjemand anders mit i7.
@gestein: Kommt mir seltsam vor - weil der Beginn mit state->reported immer das größere hash anlegt, in dem dann batPct gefüllt ist. Und wenn es gefüllt ist, wird auch ein Update gemacht.
Das kann ich gerne testen. Habe einen i7.
Das mit dem batPct schaue ich mir mal genauer an.
Lg, Gerhard
Zitat von: Prof. Dr. Peter Henning am 07 März 2021, 12:24:17
Bitte zu diesem Fehler einen neuen Thread aufmachen, in diesem Unterforum hier, Titel "MQTT2_DEVICE mit httpUtils_Fehler".
LG
pah
Done: https://forum.fhem.de/index.php/topic,119367.0.html
Hallo pah,
bei mir kommt immer wieder dieser Fehler: "2021.03.07 14:10:56.651 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= ....."
Siehe auch hier: https://forum.fhem.de/index.php/topic,114166.msg1136619.html#msg1136619 (https://forum.fhem.de/index.php/topic,114166.msg1136619.html#msg1136619)
Wo kann ich da ansetzen?
Im Code ist es hier:
if( $evt =~ /cleanSchedule/){
#main::Log 1,"[RoombaUtils] schedule event ".$evt;
--> my %cleans = %{$staterep->{'cleanSchedule'}};
schedule(\%cleans,\%ret);
}
Ich habe den i7, kann das mit dem zu haben:
https://forum.fhem.de/index.php/topic,114166.msg1137830.html#msg1137830 (https://forum.fhem.de/index.php/topic,114166.msg1137830.html#msg1137830)
lg, Gerhard
Beim I7 gibt's cleanSchedule nicht... Nur cleanSchedule2.
Die Herren mit i7: Bitte mal die angehängte Version testen - ich brauche einen vollständigen Event von cleanSchedule2 aus dem Log.
Außerdem folgende Fragen an i7-Besitzer:
Kann die Kiste tatsächlich nur 4 verschiedene Programme?
Bieibt z.B. Programm Nr. 3 erhalten, wenn man Programm Nr. 2 deaktiviert? Oder wird alles, was nicht aktiviert ist, automatisch gelöscht?
Sehe ich das richtig, dass man nicht ein Programm pro Wochentag vorgibt, sondern für jedes Reinigungsprogramm außer der Startzeit die Wochentage und Regionen auswählt?
Roadmap: Ich werde aus den RoombaUtils ein echtes Device-Modul machen - das allerdings alle internen Routinen des MQTT2-Device nutzt. Der Hintergrund ist, dass ich dann die Darstellungsroutinen im FHEMWEB-Frontend umbiegen kann - um beispielsweise die aktuelle Position als Graifk in Echtzeit anzuzeigen.
LG
pah
Hallo,
aber gerne doch :)
Zitatich brauche einen vollständigen Event von cleanSchedule2 aus dem Log
2 Zeitpläne, einmal aktiviert, einmal nicht aktiviert
"cleanSchedule2": [{"enabled": false, "type": 0, "start": {"day": [1, 3], "hour": 9, "min": 0}, "cmd": {"command": "start", "ordered": 1, "pmap_id": "zBzSo0ghQ-SYfM7yqTxZUg", "regions": [{"region_id": "10", "type": "rid"}], "user_pmapv_id": "210227T111225"}}, {"enabled": true, "type": 0, "start": {"day": [2, 4, 6], "hour": 11, "min": 0}, "cmd": {"command": "start", "ordered": 1, "pmap_id": "zBzSo0ghQ-SYfM7yqTxZUg", "regions": [{"region_id": "10", "type": "rid"}, {"region_id": "6", "type": "rid"}, {"region_id": "5", "type": "rid"}, {"region_id": "8", "type": "rid"}], "user_pmapv_id": "210227T111225"}}],
ZitatKann die Kiste tatsächlich nur 4 verschiedene Programme?
Nein, die 4 haben ich willkürlich gewählt, ich habe gerade mal probiert in der App 7 Zeitpläne einzurichten: Geht. Vermutlich auch mehr, ich kann heute abend mal ausloten was geht.
ZitatBieibt z.B. Programm Nr. 3 erhalten, wenn man Programm Nr. 2 deaktiviert?
Ja, bleibt erhalten, "enabled" geht für das Programm dann auf "false"
ZitatOder wird alles, was nicht aktiviert ist, automatisch gelöscht?
Nein, aber die Reihenfolge in cleanSchedule2 ändert sich. Kann ich grad wegen der Arbeitsverweigerung der httputils nicht systematisch testen.
ZitatSehe ich das richtig, dass man nicht ein Programm pro Wochentag vorgibt, sondern für jedes Reinigungsprogramm außer der Startzeit die Wochentage und Regionen auswählt?
Man kann pro Zeitplan folgendes einstellen bzw. auswählen: Startzeit (hh:mm), einen oder mehrere Wochentag(e), Geschoß (bzw map, ich habe 2 Geschosse kartografiert), und Raum/Räume = Region.
Testen würde ich gerne, aber die httputils sind gegen mich :(
LG,
Hermann
Hmmm. So wie ich das sehe, wurden weder httpUtils, noch MQTT2_DEVICE upgedated - aber MQTT2_CLIENT.
LG
pah
Hallo,
Die neue Version läuft schon - sogar mein "bssid" ist drinnen. Danke.
Ich bin noch nicht dazugekommen, das Schedule zu testen, aber mir ist zu meinem Fehler etwas aufgefallen.
Über "periodicCmd" verbinde ich alle 15min den MQTT2_CLIENT (also über set myRoombaMQTTClient connect).
periodicCmd update:15
Den Befehl "update" habe ich definiert als setList: update:noArg {fhem("set ".InternalVal($NAME,"IODev","") . "connect")}
Damit kommen dann die folgenden log-Einträge:
2021.03.07 17:26:48.992 3: MQTT2_DEVICE set myRoomba update
2021.03.07 17:26:50.684 4: MQTT2_DEVICE_Parse: myRoomba $aws/things/D6DBF1F7DA88458CBC34ED564C42DCD1/shadow/update => {roomba::reading($NAME,$EVENT)}
2021.03.07 17:26:50.709 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $EVTPART10= $evalSpecials->{'%EVTPART10'};my $EVTPART100= $evalSpecials->{'%EVTPART100'};my $EVTPART101= $evalSpecials->{'%EVTPART101'};my $EVTPART102= $evalSpecials->{'%EVTPART102'};my $EVTPART103= $evalSpecials->{'%EVTPART103'};my $EVTPART104= $evalSpecials->{'%EVTPART104'};my $EVTPART105= $evalSpecials->{'%EVTPART105'};my $EVTPART106= $evalSpecials->{'%EVTPART106'};my $EVTPART107= $evalSpecials->{'%EVTPART107'};my $EVTPART108= $evalSpecials->{'%EVTPART108'};my $EVTPART109= $evalSpecials->{'%EVTPART109'};my $EVTPART11= $evalSpecials->{'%EVTPART11'};my $EVTPART110= $evalSpecials->{'%EVTPART110'};my $EVTPART111= $evalSpecials->{'%EVTPART111'};my $EVTPART112= $evalSpecials->{'%EVTPART112'};my $EVTPART113= $evalSpecials->{'%EVTPART113'};my $EVTPART114= $evalSpecials->{'%EVTPART114'};my $EVTPART115= $evalSpecials->{'%EVTPART115'};my $EVTPART116= $evalSpecials->{'%EVTPART116'};my $EVTPART117= $evalSpecials->{'%EVTPART117'};my $EVTPART118= $evalSpecials->{'%EVTPART118'};my $EVTPART119= $evalSpecials->{'%EVTPART119'};my $EVTPART12= $evalSpecials->{'%EVTPART12'};my $EVTPART120= $evalSpecials->{'%EVTPART120'};my $EVTPART121= $evalSpecials->{'%EVTPART121'};my $EVTPART122= $evalSpecials->{'%EVTPART122'};my $EVTPART123= $evalSpecials->{'%EVTPART123'};my $EVTPART124= $evalSpecials->{'%EVTPART124'};my $EVTPART125= $evalSpecials->{'%EVTPART125'};my $EVTPART126= $evalSpecials->{'%EVTPART126'};my $EVTPART127= $evalSpecials->{'%EVTPART127'};my $EVTPART128= $evalSpecials->{'%EVTPART128'};my $EVTPART129= $evalSpecials->{'%EVTPART129'};my $EVTPART13= $evalSpecials->{'%EVTPART13'};my $EVTPART130= $evalSpecials->{'%EVTPART130'};my $EVTPART131= $evalSpecials->{'%EVTPART131'};my $EVTPART132= $evalSpecials->{'%EVTPART132'};my $EVTPART133= $evalSpecials->{'%EVTPART133'};my $EVTPART134= $evalSpecials->{'%EVTPART134'};my $EVTPART135= $evalSpecials->{'%EVTPART135'};my $EVTPART136= $evalSpecials->{'%EVTPART136'};my $EVTPART137= $evalSpecials->{'%EVTPART137'};my $EVTPART138= $evalSpecials->{'%EVTPART138'};my $EVTPART139= $evalSpecials->{'%EVTPART139'};my $EVTPART14= $evalSpecials->{'%EVTPART14'};my $EVTPART140= $evalSpecials->{'%EVTPART140'};my $EVTPART141= $evalSpecials->{'%EVTPART141'};my $EVTPART142= $evalSpecials->{'%EVTPART142'};my $EVTPART143= $evalSpecials->{'%EVTPART143'};my $EVTPART144= $evalSpecials->{'%EVTPART144'};my $EVTPART145= $evalSpecials->{'%EVTPART145'};my $EVTPART146= $evalSpecials->{'%EVTPART146'};my $EVTPART147= $evalSpecials->{'%EVTPART147'};my $EVTPART148= $evalSpecials->{'%EVTPART148'};my $EVTPART149= $evalSpecials->{'%EVTPART149'};my $EVTPART15= $evalSpecials->{'%EVTPART15'};my $EVTPART150= $evalSpecials->{'%EVTPART150'};my $EVTPART151= $evalSpecials->{'%EVTPART151'};my $EVTPART152= $evalSpecials->{'%EVTPART152'};my $EVTPART153= $evalSpecials->{'%EVTPART153'};my $EVTPART154= $evalSpecials->{'%EVTPART154'};my $EVTPART155= $evalSpecials->{'%EVTPART155'};my $EVTPART156= $evalSpecials->{'%EVTPART156'};my $EVTPART157= $evalSpecials->{'%EVTPART157'};my $EVTPART158= $evalSpecials->{'%EVTPART158'};my $EVTPART159= $evalSpecials->{'%EVTPART159'};my $EVTPART16= $evalSpecials->{'%EVTPART16'};my $EVTPART160= $evalSpecials->{'%EVTPART160'};my $EVTPART161= $evalSpecials->{'%EVTPART161'};my $EVTPART162= $evalSpecials->{'%EVTPART162'};my $EVTPART163= $evalSpecials->{'%EVTPART163'};my $EVTPART164= $evalSpecials->{'%EVTPART164'};my $EVTPART165= $evalSpecials->{'%EVTPART165'};my $EVTPART166= $evalSpecials->{'%EVTPART166'};my $EVTPART167= $evalSpecials->{'%EVTPART167'};my $EVTPART168= $evalSpecials->{'%EVTPART168'};my $EVTPART169= $evalSpecials->{'%EVTPART169'};my $EVTPART17= $evalSpecials->{'%EVTPART17'};my $EVTPART170= $evalSpecials->{'%EVTPART170'};my $EVTPART171= $evalSpecials->{'%EVTPART171'};my $EVTPART172= $evalSpecials->{'%EVTPART172'};my $EVTPART173= $evalSpecials->{'%EVTPART173'};my $EVTPART174= $evalSpecials->{'%EVTPART174'};my $EVTPART175= $evalSpecials->{'%EVTPART175'};my $EVTPART176= $evalSpecials->{'%EVTPART176'};my $EVTPART177= $evalSpecials->{'%EVTPART177'};my $EVTPART178= $evalSpecials->{'%EVTPART178'};my $EVTPART179= $evalSpecials->{'%EVTPART179'};my $EVTPART18= $evalSpecials->{'%EVTPART18'};my $EVTPART180= $evalSpecials->{'%EVTPART180'};my $EVTPART181= $evalSpecials->{'%EVTPART181'};my $EVTPART182= $evalSpecials->{'%EVTPART182'};my $EVTPART183= $evalSpecials->{'%EVTPART183'};my $EVTPART184= $evalSpecials->{'%EVTPART184'};my $EVTPART185= $evalSpecials->{'%EVTPART185'};my $EVTPART186= $evalSpecials->{'%EVTPART186'};my $EVTPART187= $evalSpecials->{'%EVTPART187'};my $EVTPART188= $evalSpecials->{'%EVTPART188'};my $EVTPART189= $evalSpecials->{'%EVTPART189'};my $EVTPART19= $evalSpecials->{'%EVTPART19'};my $EVTPART190= $evalSpecials->{'%EVTPART190'};my $EVTPART191= $evalSpecials->{'%EVTPART191'};my $EVTPART192= $evalSpecials->{'%EVTPART192'};my $EVTPART193= $evalSpecials->{'%EVTPART193'};my $EVTPART194= $evalSpecials->{'%EVTPART194'};my $EVTPART195= $evalSpecials->{'%EVTPART195'};my $EVTPART196= $evalSpecials->{'%EVTPART196'};my $EVTPART197= $evalSpecials->{'%EVTPART197'};my $EVTPART198= $evalSpecials->{'%EVTPART198'};my $EVTPART199= $evalSpecials->{'%EVTPART199'};my $EVTPART2= $evalSpecials->{'%EVTPART2'};my $EVTPART20= $evalSpecials->{'%EVTPART20'};my $EVTPART200= $evalSpecials->{'%EVTPART200'};my $EVTPART201= $evalSpecials->{'%EVTPART201'};my $EVTPART202= $evalSpecials->{'%EVTPART202'};my $EVTPART203= $evalSpecials->{'%EVTPART203'};my $EVTPART204= $evalSpecials->{'%EVTPART204'};my $EVTPART205= $evalSpecials->{'%EVTPART205'};my $EVTPART206= $evalSpecials->{'%EVTPART206'};my $EVTPART207= $evalSpecials->{'%EVTPART207'};my $EVTPART208= $evalSpecials->{'%EVTPART208'};my $EVTPART209= $evalSpecials->{'%EVTPART209'};my $EVTPART21= $evalSpecials->{'%EVTPART21'};my $EVTPART210= $evalSpecials->{'%EVTPART210'};my $EVTPART211= $evalSpecials->{'%EVTPART211'};my $EVTPART212= $evalSpecials->{'%EVTPART212'};my $EVTPART213= $evalSpecials->{'%EVTPART213'};my $EVTPART214= $evalSpecials->{'%EVTPART214'};my $EVTPART215= $evalSpecials->{'%EVTPART215'};my $EVTPART216= $evalSpecials->{'%EVTPART216'};my $EVTPART217= $evalSpecials->{'%EVTPART217'};my $EVTPART218= $evalSpecials->{'%EVTPART218'};my $EVTPART219= $evalSpecials->{'%EVTPART219'};my $EVTPART22= $evalSpecials->{'%EVTPART22'};my $EVTPART220= $evalSpecials->{'%EVTPART220'};my $EVTPART221= $evalSpecials->{'%EVTPART221'};my $EVTPART222= $evalSpecials->{'%EVTPART222'};my $EVTPART223= $evalSpecials->{'%EVTPART223'};my $EVTPART224= $evalSpecials->{'%EVTPART224'};my $EVTPART225= $evalSpecials->{'%EVTPART225'};my $EVTPART226= $evalSpecials->{'%EVTPART226'};my $EVTPART227= $evalSpecials->{'%EVTPART227'};my $EVTPART228= $evalSpecials->{'%EVTPART228'};my $EVTPART229= $evalSpecials->{'%EVTPART229'};my $EVTPART23= $evalSpecials->{'%EVTPART23'};my $EVTPART230= $evalSpecials->{'%EVTPART230'};my $EVTPART231= $evalSpecials->{'%EVTPART231'};my $EVTPART232= $evalSpecials->{'%EVTPART232'};my $EVTPART233= $evalSpecials->{'%EVTPART233'};my $EVTPART234= $evalSpecials->{'%EVTPART234'};my $EVTPART235= $evalSpecials->{'%EVTPART235'};my $EVTPART236= $evalSpecials->{'%EVTPART236'};my $EVTPART237= $evalSpecials->{'%EVTPART237'};my $EVTPART238= $evalSpecials->{'%EVTPART238'};my $EVTPART239= $evalSpecials->{'%EVTPART239'};my $EVTPART24= $evalSpecials->{'%EVTPART24'};my $EVTPART240= $evalSpecials->{'%EVTPART240'};my $EVTPART241= $evalSpecials->{'%EVTPART241'};my $EVTPART242= $evalSpecials->{'%EVTPART242'};my $EVTPART243= $evalSpecials->{'%EVTPART243'};my $EVTPART244= $evalSpecials->{'%EVTPART244'};my $EVTPART245= $evalSpecials->{'%EVTPART245'};my $EVTPART246= $evalSpecials->{'%EVTPART246'};my $EVTPART247= $evalSpecials->{'%EVTPART247'};my $EVTPART248= $evalSpecials->{'%EVTPART248'};my $EVTPART249= $evalSpecials->{'%EVTPART249'};my $EVTPART25= $evalSpecials->{'%EVTPART25'};my $EVTPART250= $evalSpecials->{'%EVTPART250'};my $EVTPART251= $evalSpecials->{'%EVTPART251'};my $EVTPART252= $evalSpecials->{'%EVTPART252'};my $EVTPART253= $evalSpecials->{'%EVTPART253'};my $EVTPART254= $evalSpecials->{'%EVTPART254'};my $EVTPART255= $evalSpecials->{'%EVTPART255'};my $EVTPART256= $evalSpecials->{'%EVTPART256'};my $EVTPART257= $evalSpecials->{'%EVTPART257'};my $EVTPART258= $evalSpecials->{'%EVTPART258'};my $EVTPART259= $evalSpecials->{'%EVTPART259'};my $EVTPART26= $evalSpecials->{'%EVTPART26'};my $EVTPART260= $evalSpecials->{'%EVTPART260'};my $EVTPART261= $evalSpecials->{'%EVTPART261'};my $EVTPART262= $evalSpecials->{'%EVTPART262'};my $EVTPART263= $evalSpecials->{'%EVTPART263'};my $EVTPART264= $evalSpecials->{'%EVTPART264'};my $EVTPART265= $evalSpecials->{'%EVTPART265'};my $EVTPART266= $evalSpecials->{'%EVTPART266'};my $EVTPART267= $evalSpecials->{'%EVTPART267'};my $EVTPART268= $evalSpecials->{'%EVTPART268'};my $EVTPART269= $evalSpecials->{'%EVTPART269'};my $EVTPART27= $evalSpecials->{'%EVTPART27'};my $EVTPART270= $evalSpecials->{'%EVTPART270'};my $EVTPART271= $evalSpecials->{'%EVTPART271'};my $EVTPART272= $evalSpecials->{'%EVTPART272'};my $EVTPART273= $evalSpecials->{'%EVTPART273'};my $EVTPART274= $evalSpecials->{'%EVTPART274'};my $EVTPART275= $evalSpecials->{'%EVTPART275'};my $EVTPART276= $evalSpecials->{'%EVTPART276'};my $EVTPART277= $evalSpecials->{'%EVTPART277'};my $EVTPART278= $evalSpecials->{'%EVTPART278'};my $EVTPART279= $evalSpecials->{'%EVTPART279'};my $EVTPART28= $evalSpecials->{'%EVTPART28'};my $EVTPART280= $evalSpecials->{'%EVTPART280'};my $EVTPART281= $evalSpecials->{'%EVTPART281'};my $EVTPART282= $evalSpecials->{'%EVTPART282'};my $EVTPART283= $evalSpecials->{'%EVTPART283'};my $EVTPART284= $evalSpecials->{'%EVTPART284'};my $EVTPART285= $evalSpecials->{'%EVTPART285'};my $EVTPART286= $evalSpecials->{'%EVTPART286'};my $EVTPART287= $evalSpecials->{'%EVTPART287'};my $EVTPART288= $evalSpecials->{'%EVTPART288'};my $EVTPART289= $evalSpecials->{'%EVTPART289'};my $EVTPART29= $evalSpecials->{'%EVTPART29'};my $EVTPART290= $evalSpecials->{'%EVTPART290'};my $EVTPART291= $evalSpecials->{'%EVTPART291'};my $EVTPART292= $evalSpecials->{'%EVTPART292'};my $EVTPART293= $evalSpecials->{'%EVTPART293'};my $EVTPART294= $evalSpecials->{'%EVTPART294'};my $EVTPART295= $evalSpecials->{'%EVTPART295'};my $EVTPART296= $evalSpecials->{'%EVTPART296'};my $EVTPART297= $evalSpecials->{'%EVTPART297'};my $EVTPART298= $evalSpecials->{'%EVTPART298'};my $EVTPART299= $evalSpecials->{'%EVTPART299'};my $EVTPART3= $evalSpecials->{'%EVTPART3'};my $EVTPART30= $evalSpecials->{'%EVTPART30'};my $EVTPART300= $evalSpecials->{'%EVTPART300'};my $EVTPART301= $evalSpecials->{'%EVTPART301'};my $EVTPART302= $evalSpecials->{'%EVTPART302'};my $EVTPART303= $evalSpecials->{'%EVTPART303'};my $EVTPART304= $evalSpecials->{'%EVTPART304'};my $EVTPART305= $evalSpecials->{'%EVTPART305'};my $EVTPART306= $evalSpecials->{'%EVTPART306'};my $EVTPART307= $evalSpecials->{'%EVTPART307'};my $EVTPART308= $evalSpecials->{'%EVTPART308'};my $EVTPART309= $evalSpecials->{'%EVTPART309'};my $EVTPART31= $evalSpecials->{'%EVTPART31'};my $EVTPART310= $evalSpecials->{'%EVTPART310'};my $EVTPART311= $evalSpecials->{'%EVTPART311'};my $EVTPART312= $evalSpecials->{'%EVTPART312'};my $EVTPART313= $evalSpecials->{'%EVTPART313'};my $EVTPART314= $evalSpecials->{'%EVTPART314'};my $EVTPART315= $evalSpecials->{'%EVTPART315'};my $EVTPART316= $evalSpecials->{'%EVTPART316'};my $EVTPART317= $evalSpecials->{'%EVTPART317'};my $EVTPART318= $evalSpecials->{'%EVTPART318'};my $EVTPART319= $evalSpecials->{'%EVTPART319'};my $EVTPART32= $evalSpecials->{'%EVTPART32'};my $EVTPART320= $evalSpecials->{'%EVTPART320'};my $EVTPART321= $evalSpecials->{'%EVTPART321'};my $EVTPART322= $evalSpecials->{'%EVTPART322'};my $EVTPART323= $evalSpecials->{'%EVTPART323'};my $EVTPART324= $evalSpecials->{'%EVTPART324'};my $EVTPART325= $evalSpecials->{'%EVTPART325'};my $EVTPART326= $evalSpecials->{'%EVTPART326'};my $EVTPART327= $evalSpecials->{'%EVTPART327'};my $EVTPART328= $evalSpecials->{'%EVTPART328'};my $EVTPART329= $evalSpecials->{'%EVTPART329'};my $EVTPART33= $evalSpecials->{'%EVTPART33'};my $EVTPART330= $evalSpecials->{'%EVTPART330'};my $EVTPART331= $evalSpecials->{'%EVTPART331'};my $EVTPART332= $evalSpecials->{'%EVTPART332'};my $EVTPART333= $evalSpecials->{'%EVTPART333'};my $EVTPART334= $evalSpecials->{'%EVTPART334'};my $EVTPART335= $evalSpecials->{'%EVTPART335'};my $EVTPART336= $evalSpecials->{'%EVTPART336'};my $EVTPART337= $evalSpecials->{'%EVTPART337'};my $EVTPART338= $evalSpecials->{'%EVTPART338'};my $EVTPART339= $evalSpecials->{'%EVTPART339'};my $EVTPART34= $evalSpecials->{'%EVTPART34'};my $EVTPART340= $evalSpecials->{'%EVTPART340'};my $EVTPART341= $evalSpecials->{'%EVTPART341'};my $EVTPART342= $evalSpecials->{'%EVTPART342'};my $EVTPART343= $evalSpecials->{'%EVTPART343'};my $EVTPART344= $evalSpecials->{'%EVTPART344'};my $EVTPART345= $evalSpecials->{'%EVTPART345'};my $EVTPART346= $evalSpecials->{'%EVTPART346'};my $EVTPART347= $evalSpecials->{'%EVTPART347'};my $EVTPART348= $evalSpecials->{'%EVTPART348'};my $EVTPART349= $evalSpecials->{'%EVTPART349'};my $EVTPART35= $evalSpecials->{'%EVTPART35'};my $EVTPART350= $evalSpecials->{'%EVTPART350'};my $EVTPART351= $evalSpecials->{'%EVTPART351'};my $EVTPART352= $evalSpecials->{'%EVTPART352'};my $EVTPART353= $evalSpecials->{'%EVTPART353'};my $EVTPART354= $evalSpecials->{'%EVTPART354'};my $EVTPART355= $evalSpecials->{'%EVTPART355'};my $EVTPART356= $evalSpecials->{'%EVTPART356'};my $EVTPART357= $evalSpecials->{'%EVTPART357'};my $EVTPART358= $evalSpecials->{'%EVTPART358'};my $EVTPART359= $evalSpecials->{'%EVTPART359'};my $EVTPART36= $evalSpecials->{'%EVTPART36'};my $EVTPART360= $evalSpecials->{'%EVTPART360'};my $EVTPART361= $evalSpecials->{'%EVTPART361'};my $EVTPART362= $evalSpecials->{'%EVTPART362'};my $EVTPART363= $evalSpecials->{'%EVTPART363'};my $EVTPART364= $evalSpecials->{'%EVTPART364'};my $EVTPART365= $evalSpecials->{'%EVTPART365'};my $EVTPART366= $evalSpecials->{'%EVTPART366'};my $EVTPART367= $evalSpecials->{'%EVTPART367'};my $EVTPART368= $evalSpecials->{'%EVTPART368'};my $EVTPART369= $evalSpecials->{'%EVTPART369'};my $EVTPART37= $evalSpecials->{'%EVTPART37'};my $EVTPART370= $evalSpecials->{'%EVTPART370'};my $EVTPART371= $evalSpecials->{'%EVTPART371'};my $EVTPART372= $evalSpecials->{'%EVTPART372'};my $EVTPART373= $evalSpecials->{'%EVTPART373'};my $EVTPART374= $evalSpecials->{'%EVTPART374'};my $EVTPART375= $evalSpecials->{'%EVTPART375'};my $EVTPART376= $evalSpecials->{'%EVTPART376'};my $EVTPART377= $evalSpecials->{'%EVTPART377'};my $EVTPART378= $evalSpecials->{'%EVTPART378'};my $EVTPART379= $evalSpecials->{'%EVTPART379'};my $EVTPART38= $evalSpecials->{'%EVTPART38'};my $EVTPART380= $evalSpecials->{'%EVTPART380'};my $EVTPART381= $evalSpecials->{'%EVTPART381'};my $EVTPART382= $evalSpecials->{'%EVTPART382'};my $EVTPART383= $evalSpecials->{'%EVTPART383'};my $EVTPART384= $evalSpecials->{'%EVTPART384'};my $EVTPART385= $evalSpecials->{'%EVTPART385'};my $EVTPART386= $evalSpecials->{'%EVTPART386'};my $EVTPART387= $evalSpecials->{'%EVTPART387'};my $EVTPART388= $evalSpecials->{'%EVTPART388'};my $EVTPART389= $evalSpecials->{'%EVTPART389'};my $EVTPART39= $evalSpecials->{'%EVTPART39'};my $EVTPART390= $evalSpecials->{'%EVTPART390'};my $EVTPART391= $evalSpecials->{'%EVTPART391'};my $EVTPART392= $evalSpecials->{'%EVTPART392'};my $EVTPART393= $evalSpecials->{'%EVTPART393'};my $EVTPART394= $evalSpecials->{'%EVTPART394'};my $EVTPART395= $evalSpecials->{'%EVTPART395'};my $EVTPART396= $evalSpecials->{'%EVTPART396'};my $EVTPART397= $evalSpecials->{'%EVTPART397'};my $EVTPART398= $evalSpecials->{'%EVTPART398'};my $EVTPART399= $evalSpecials->{'%EVTPART399'};my $EVTPART4= $evalSpecials->{'%EVTPART4'};my $EVTPART40= $evalSpecials->{'%EVTPART40'};my $EVTPART400= $evalSpecials->{'%EVTPART400'};my $EVTPART401= $evalSpecials->{'%EVTPART401'};my $EVTPART402= $evalSpecials->{'%EVTPART402'};my $EVTPART403= $evalSpecials->{'%EVTPART403'};my $EVTPART404= $evalSpecials->{'%EVTPART404'};my $EVTPART405= $evalSpecials->{'%EVTPART405'};my $EVTPART406= $evalSpecials->{'%EVTPART406'};my $EVTPART407= $evalSpecials->{'%EVTPART407'};my $EVTPART408= $evalSpecials->{'%EVTPART408'};my $EVTPART409= $evalSpecials->{'%EVTPART409'};my $EVTPART41= $evalSpecials->{'%EVTPART41'};my $EVTPART410= $evalSpecials->{'%EVTPART410'};my $EVTPART411= $evalSpecials->{'%EVTPART411'};my $EVTPART412= $evalSpecials->{'%EVTPART412'};my $EVTPART413= $evalSpecials->{'%EVTPART413'};my $EVTPART414= $evalSpecials->{'%EVTPART414'};my $EVTPART415= $evalSpecials->{'%EVTPART415'};my $EVTPART416= $evalSpecials->{'%EVTPART416'};my $EVTPART417= $evalSpecials->{'%EVTPART417'};my $EVTPART418= $evalSpecials->{'%EVTPART418'};my $EVTPART419= $evalSpecials->{'%EVTPART419'};my $EVTPART42= $evalSpecials->{'%EVTPART42'};my $EVTPART420= $evalSpecials->{'%EVTPART420'};my $EVTPART421= $evalSpecials->{'%EVTPART421'};my $EVTPART422= $evalSpecials->{'%EVTPART422'};my $EVTPART423= $evalSpecials->{'%EVTPART423'};my $EVTPART424= $evalSpecials->{'%EVTPART424'};my $EVTPART425= $evalSpecials->{'%EVTPART425'};my $EVTPART426= $evalSpecials->{'%EVTPART426'};my $EVTPART427= $evalSpecials->{'%EVTPART427'};my $EVTPART428= $evalSpecials->{'%EVTPART428'};my $EVTPART429= $evalSpecials->{'%EVTPART429'};my $EVTPART43= $evalSpecials->{'%EVTPART43'};my $EVTPART430= $evalSpecials->{'%EVTPART430'};my $EVTPART431= $evalSpecials->{'%EVTPART431'};my $EVTPART432= $evalSpecials->{'%EVTPART432'};my $EVTPART433= $evalSpecials->{'%EVTPART433'};my $EVTPART434= $evalSpecials->{'%EVTPART434'};my $EVTPART435= $evalSpecials->{'%EVTPART435'};my $EVTPART436= $evalSpecials->{'%EVTPART436'};my $EVTPART437= $evalSpecials->{'%EVTPART437'};my $EVTPART438= $evalSpecials->{'%EVTPART438'};my $EVTPART439= $evalSpecials->{'%EVTPART439'};my $EVTPART44= $evalSpecials->{'%EVTPART44'};my $EVTPART440= $evalSpecials->{'%EVTPART440'};my $EVTPART441= $evalSpecials->{'%EVTPART441'};my $EVTPART442= $evalSpecials->{'%EVTPART442'};my $EVTPART443= $evalSpecials->{'%EVTPART443'};my $EVTPART444= $evalSpecials->{'%EVTPART444'};my $EVTPART445= $evalSpecials->{'%EVTPART445'};my $EVTPART446= $evalSpecials->{'%EVTPART446'};my $EVTPART447= $evalSpecials->{'%EVTPART447'};my $EVTPART448= $evalSpecials->{'%EVTPART448'};my $EVTPART449= $evalSpecials->{'%EVTPART449'};my $EVTPART45= $evalSpecials->{'%EVTPART45'};my $EVTPART450= $evalSpecials->{'%EVTPART450'};my $EVTPART451= $evalSpecials->{'%EVTPART451'};my $EVTPART452= $evalSpecials->{'%EVTPART452'};my $EVTPART453= $evalSpecials->{'%EVTPART453'};my $EVTPART454= $evalSpecials->{'%EVTPART454'};my $EVTPART455= $evalSpecials->{'%EVTPART455'};my $EVTPART456= $evalSpecials->{'%EVTPART456'};my $EVTPART457= $evalSpecials->{'%EVTPART457'};my $EVTPART458= $evalSpecials->{'%EVTPART458'};my $EVTPART459= $evalSpecials->{'%EVTPART459'};my $EVTPART46= $evalSpecials->{'%EVTPART46'};my $EVTPART460= $evalSpecials->{'%EVTPART460'};my $EVTPART461= $evalSpecials->{'%EVTPART461'};my $EVTPART462= $evalSpecials->{'%EVTPART462'};my $EVTPART463= $evalSpecials->{'%EVTPART463'};my $EVTPART464= $evalSpecials->{'%EVTPART464'};my $EVTPART465= $evalSpecials->{'%EVTPART465'};my $EVTPART466= $evalSpecials->{'%EVTPART466'};my $EVTPART467= $evalSpecials->{'%EVTPART467'};my $EVTPART468= $evalSpecials->{'%EVTPART468'};my $EVTPART469= $evalSpecials->{'%EVTPART469'};my $EVTPART47= $evalSpecials->{'%EVTPART47'};my $EVTPART470= $evalSpecials->{'%EVTPART470'};my $EVTPART471= $evalSpecials->{'%EVTPART471'};my $EVTPART472= $evalSpecials->{'%EVTPART472'};my $EVTPART473= $evalSpecials->{'%EVTPART473'};my $EVTPART474= $evalSpecials->{'%EVTPART474'};my $EVTPART475= $evalSpecials->{'%EVTPART475'};my $EVTPART48= $evalSpecials->{'%EVTPART48'};my $EVTPART49= $evalSpecials->{'%EVTPART49'};my $EVTPART5= $evalSpecials->{'%EVTPART5'};my $EVTPART50= $evalSpecials->{'%EVTPART50'};my $EVTPART51= $evalSpecials->{'%EVTPART51'};my $EVTPART52= $evalSpecials->{'%EVTPART52'};my $EVTPART53= $evalSpecials->{'%EVTPART53'};my $EVTPART54= $evalSpecials->{'%EVTPART54'};my $EVTPART55= $evalSpecials->{'%EVTPART55'};my $EVTPART56= $evalSpecials->{'%EVTPART56'};my $EVTPART57= $evalSpecials->{'%EVTPART57'};my $EVTPART58= $evalSpecials->{'%EVTPART58'};my $EVTPART59= $evalSpecials->{'%EVTPART59'};my $EVTPART6= $evalSpecials->{'%EVTPART6'};my $EVTPART60= $evalSpecials->{'%EVTPART60'};my $EVTPART61= $evalSpecials->{'%EVTPART61'};my $EVTPART62= $evalSpecials->{'%EVTPART62'};my $EVTPART63= $evalSpecials->{'%EVTPART63'};my $EVTPART64= $evalSpecials->{'%EVTPART64'};my $EVTPART65= $evalSpecials->{'%EVTPART65'};my $EVTPART66= $evalSpecials->{'%EVTPART66'};my $EVTPART67= $evalSpecials->{'%EVTPART67'};my $EVTPART68= $evalSpecials->{'%EVTPART68'};my $EVTPART69= $evalSpecials->{'%EVTPART69'};my $EVTPART7= $evalSpecials->{'%EVTPART7'};my $EVTPART70= $evalSpecials->{'%EVTPART70'};my $EVTPART71= $evalSpecials->{'%EVTPART71'};my $EVTPART72= $evalSpecials->{'%EVTPART72'};my $EVTPART73= $evalSpecials->{'%EVTPART73'};my $EVTPART74= $evalSpecials->{'%EVTPART74'};my $EVTPART75= $evalSpecials->{'%EVTPART75'};my $EVTPART76= $evalSpecials->{'%EVTPART76'};my $EVTPART77= $evalSpecials->{'%EVTPART77'};my $EVTPART78= $evalSpecials->{'%EVTPART78'};my $EVTPART79= $evalSpecials->{'%EVTPART79'};my $EVTPART8= $evalSpecials->{'%EVTPART8'};my $EVTPART80= $evalSpecials->{'%EVTPART80'};my $EVTPART81= $evalSpecials->{'%EVTPART81'};my $EVTPART82= $evalSpecials->{'%EVTPART82'};my $EVTPART83= $evalSpecials->{'%EVTPART83'};my $EVTPART84= $evalSpecials->{'%EVTPART84'};my $EVTPART85= $evalSpecials->{'%EVTPART85'};my $EVTPART86= $evalSpecials->{'%EVTPART86'};my $EVTPART87= $evalSpecials->{'%EVTPART87'};my $EVTPART88= $evalSpecials->{'%EVTPART88'};my $EVTPART89= $evalSpecials->{'%EVTPART89'};my $EVTPART9= $evalSpecials->{'%EVTPART9'};my $EVTPART90= $evalSpecials->{'%EVTPART90'};my $EVTPART91= $evalSpecials->{'%EVTPART91'};my $EVTPART92= $evalSpecials->{'%EVTPART92'};my $EVTPART93= $evalSpecials->{'%EVTPART93'};my $EVTPART94= $evalSpecials->{'%EVTPART94'};my $EVTPART95= $evalSpecials->{'%EVTPART95'};my $EVTPART96= $evalSpecials->{'%EVTPART96'};my $EVTPART97= $evalSpecials->{'%EVTPART97'};my $EVTPART98= $evalSpecials->{'%EVTPART98'};my $EVTPART99= $evalSpecials->{'%EVTPART99'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Not a HASH reference at ./FHEM/99_RoombaUtils.pm line 360.
In Zeile 360 kommt ein "Not a HASH reference at ./FHEM/99_RoombaUtils.pm line 360."
Mache ich etwas falsch?
lg, Gerhard
Kann ich noch nicht sagen - das ist genau die Zeile, die das cleanSchedule2 auswertet.
Bitte mal die angehängte Version probieren und schauen, was im Log steht.
LG
pah
Hi,
nachdem mein Roomba wieder mag (PW neu ausgelesen, ist identisch, nochmal eingetragen, restart --> geht...):
Folgende Fehlermeldung beim restart:
reload: Error:Modul 99_RoombaUtils deactivated:
Can't use bareword ("evtptr") as an ARRAY ref while "strict refs" in use at ./FHEM/99_RoombaUtils.pm line 604.
und wenn ich ein "reload" der RoombaUtils mache:
Can't use bareword ("evtptr") as an ARRAY ref while "strict refs" in use at ./FHEM/99_RoombaUtils.pm line 604.
LG,
Hermann
PS: Ich hab mal ganz naiv ein "$" vor "evtptr" in Zeile 604 und 613 eingefügt (ja, ohne genau zu wissen was ich tue ;) )
604 my %evstart = %{$evtptr->[$i]->{'start'}};
613 my %evcmd = %{$evtptr->[$i]->{'cmd'}};
Dann ergibt ein reload:
Global symbol "$evstart" requires explicit package name (did you forget to declare "my $evstart"?) at ./FHEM/99_RoombaUtils.pm line 605.
Global symbol "$evstart" requires explicit package name (did you forget to declare "my $evstart"?) at ./FHEM/99_RoombaUtils.pm line 606.
Global symbol "$evstart" requires explicit package name (did you forget to declare "my $evstart"?) at ./FHEM/99_RoombaUtils.pm line 609.
Global symbol "$evcmd" requires explicit package name (did you forget to declare "my $evcmd"?) at ./FHEM/99_RoombaUtils.pm line 615.
Global symbol "$evcmd" requires explicit package name (did you forget to declare "my $evcmd"?) at ./FHEM/99_RoombaUtils.pm line 619.
Wollte gerade das gleiche schreiben.
Fehlermeldung bei "reload 99_RoombaUtils":
Can't use bareword ("evtptr") as an ARRAY ref while "strict refs" in use at ./FHEM/99_RoombaUtils.pm line 604.
lg, Gerhard
Eines ist mir noch aufgefallen:
Der myRoombaMQTTClient wird normalerweise das "disconnectAfter" auf 300s gesetzt.
In Zeile 725 wird es aber nun auf 7s gesetzt: main::fhem("attr $iodev disconnectAfter 7");
Stimmt das so?
lg, Gerhard
Zitat von: gestein am 08 März 2021, 09:40:34
Eines ist mir noch aufgefallen:
Beim myRoombaMQTTClient wird normalerweise das "disconnectAfter" auf 300s gesetzt.
In Zeile 725 wird es aber nun auf 7s gesetzt: main::fhem("attr $iodev disconnectAfter 7");
Stimmt das so?
lg, Gerhard
@gestein: Ja, nach Ablauf der Mission.
Zu dem Fehler: Ähem, man schaue bitte auf die Uhrzeit des Posts. Ich sollte nicht vor 5:00 solche Änderungen einfügen. Etwas Geduld, bitte.
LG
pah
Edit: OK, die Anlage sollte jetzt ohne Fehler laufen.
Hallo Pah,
Die Zeit des Posting ist mir aufgefallen ;-)
Das mit den 7sec beisst sich dann etwas mit einem Update, wenn man es so macht wie ich.
Oder kann man ein Update per MQTT auslösen?
Aber das probieren ich mal, wenn die Utils wieder laufen.
Eine Frage noch:
Das mit dem Setzen des Attributes "disconnectAfter" beim MQTT2_CLIENT-Device ist etwas unschön, weil fhem dann jedesmal annimmt, dass man die Konfig geändert hat.
Aber damit lässt sich leben.
lg, Gerhard
Hi,
bei 5:14 war ich auch echt beeindruckt ;)
Danke für das Update - ich habe das neue Modul gerade injiziert und neu gestartet:
Error:Modul 99_RoombaUtils deactivated:
Global symbol "$evstart" requires explicit package name (did you forget to declare "my $evstart"?) at ./FHEM/99_RoombaUtils.pm line 605.
Global symbol "$evstart" requires explicit package name (did you forget to declare "my $evstart"?) at ./FHEM/99_RoombaUtils.pm line 606.
Global symbol "$evstart" requires explicit package name (did you forget to declare "my $evstart"?) at ./FHEM/99_RoombaUtils.pm line 609.
Global symbol "$evcmd" requires explicit package name (did you forget to declare "my $evcmd"?) at ./FHEM/99_RoombaUtils.pm line 615.
Global symbol "$evcmd" requires explicit package name (did you forget to declare "my $evcmd"?) at ./FHEM/99_RoombaUtils.pm line 619.
Zum disconnectAfter: Könnte man nicht den "alten" Wert auslesen, zwischenspeichern, und danach wieder setzen? Dann bleibt er nicht auf 7 oder 300 stehen...
Ich hatte heute folgende Fehlermeldung im Log:
Illegal division by zero at /usr/local/share/perl/5.30.0/Math/Polygon/Calc.pm line 329
Ich konnte das nur bereinigen, indem ich den Aufruf "finalizemap" kurz auskommentiert habe. Es stand wohl der "old state" auf "dock", obwohl der Roomba schon in "charge" war, hat dann bei jeder Message versucht finalizemap aufzurufen, ist bei "division by zero" ausgestiegen und ist damit nie in "charge" angekommen. Ich hatte den Roomba vorher manuell in einem Zimmer gestartet, wo er kein Dock hat; er bleibt dann ja brav stehen und wartet dass man ihn zum Dock trägt, aber irgendwie haben die RoombaUtils das nicht richtig mitbekommen.
Mal sehen ob ich das reproduzieren kann...
LG,
Hermann
Hmmm. Probiermodus, noch eine geänderte Version anbei.
LG
pah
Probieren ist immer gut :)
Ergebnis: Jein...RoombaUtils wird nun ohne Fehler eingelesen, aber die Readings sind weiter ohne Schedules, nur die bisherigen Readings (battery, cm*, s*) kommen. (edit: OK, schedule2 Aufruf ist ja auch auskommentiert....)
Logfile:
Zitat
[RoombaUtils] schedule2 event {"state":{"reported":{"batPct": 100, "batteryType": "F12432832R", "batInfo": {"mName": "F12432832R", "mDate": "2020-8-20", "mDaySerial": 36503, "mData": "303030333034303200000000000000000000000000", "mLife": "0C220B5010800C324F14000704C8F61900CBFE9F2611FFFF0047017900000000", "cCount": 8, "afCount": 0}, "batAuthEnable": true, "bbchg": {"nChatters": 0, "nKnockoffs": 313, "nLithF": 0, "nChgOk": 16, "aborts": [0, 0, 0], "smberr": 0}, "bbchg3": {"estCap": 2036, "nAvail": 30, "hOnDock": 421, "avgMin": 61}, "bbmssn": {"aCycleM": 31, "nMssnF": 4, "nMssnC": 2, "nMssnOk": 16, "aMssnM": 45, "nMssn": 22}, "bbnav": {"aMtrack": 0, "nGoodLmrks": 0, "aGain": 0, "aExpo": 0}, "bbpause": {"pauses": [18, 24, 46, 18, 43, 18, 24, 24, 18, 46]}, "bbrstinfo": {"nNavRst": 0, "nMobRst": 0, "causes": "0000", "nSafRst": 0, "safCauses": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, "bbrun": {"nEvacs": 18, "nCBump": 0, "nOvertemps": 0, "nWStll": 0, "nMBStll": 458, "nPanics": 84, "nPicks": 225, "nOpticalDD": 0, "nScrubs": 0, "nPiezoDD": 0, "nStuck": 13, "sqft": 47, "min": 18, "hr": 12, "nCliffsF": 3111, "nCliffsR": 0}, "bbswitch": {"nBumper": 16552, "nDrops": 413, "nDock": 18, "nSpot": 45, "nClean": 49}, "bbsys": {"min": 54, "hr": 453}, "bin": {"present": true, "full": false}, "binPause": true, "bleDevLoc": false, "cap": {"binFullDetect": 1, "dockComm": 1, "wDevLoc": 2, "bleDevLoc": 1, "edge": 0, "maps": 3, "pmaps": 4, "tLine": 2, "area": 1, "eco": 1, "multiPass": 2, "pose": 1, "team": 1, "pp": 0, "5ghz": 1, "prov": 3, "sched": 1, "svcConf": 1, "ota": 2, "log": 2, "tileScan": 1}, "carpetBoost": false, "cleanMissionStatus": {"cycle": "none", "phase": "charge", "expireM": 0, "rechrgM": 0, "error": 0, "notReady": 0, "mssnM": 10, "sqft": 50, "initiator": "none", "nMssn": 22}, "cleanSchedule2": [{"enabled": false, "type": 0, "start": {"day": [1, 3], "hour": 9, "min": 0}, "cmd": {"command": "start", "ordered": 1, "pmap_id": "xxxxxxxx", "regions": [{"region_id": "10", "type": "rid"}], "user_pmapv_id": "210227T111225"}}, {"enabled": true, "type": 0, "start": {"day": [2, 4, 6], "hour": 11, "min": 0}, "cmd": {"command": "start", "ordered": 1, "pmap_id": "yyyyyyyy", "regions": [{"region_id": "10", "type": "rid"}, {"region_id": "6", "type": "rid"}, {"region_id": "5", "type": "rid"}, {"region_id": "8", "type": "rid"}], "user_pmapv_id": "210227T111225"}}], "cloudEnv": "prod", "connected": true, "country": "DE", "deploymentState": 0, "dock": {"known": true, "pn": "unknown", "state": 301, "id": "zzzzzzzz", "fwVer": "3.0.3"}, "evacAllowed": true, "ecoCharge": false, "hwPartsRev": {"csscID": 0, "mobBrd": 10, "mobBlid": "aaaaaaa", "navSerialNo": "bbbbbbbb", "wlan0HwAddr": "50:14:79:6d:3c:3d", "NavBrd": 1}, "hwDbgr": {"swVer": "", "hw": "", "status": 0}, "langs": [{"cs-CZ": 0}, {"da-DK": 1}, {"de-DE": 2}, {"en-GB": 3}, {"en-US": 4}, {"es-ES": 5}, {"es-XL": 6}, {"fi-FI": 7}, {"fr-CA": 8}, {"fr-FR": 9}, {"he-IL": 10}, {"it-IT": 11}, {"ja-JP": 12}, {"ko-KR": 13}, {"nb-NO": 14}, {"nl-NL": 15}, {"pl-PL": 16}, {"pt-BR": 17}, {"pt-PT": 18}, {"ru-RU": 19}, {"sv-SE": 20}, {"zh-CN": 21}, {"zh-HK": 22}, {"zh-TW": 23}], "language": 2, "lastCommand": {"command": null, "initiator": null, "time": null}, "lastDisconnect": 0, "mapUploadAllowed": true, "missionTelemetry": {"aux_comms": 1, "bat_stats": 1, "camera_settings": 1, "map_hypotheses": 1, "map_load": 1, "vital_stats": 1, "vslam_report": 1}, "name": "Rumpel", "noAutoPasses": false, "noPP": false, "openOnly": false, "pmapLearningAllowed": true, "pmaps": [{"cccccccc": "210307T113149"}, {"dddddddddddd": "210306T171929"}], "pmapCL": true, "rankOverlap": 15, "sceneRecog": 1, "schedHold": false, "secureBoot": {"log": 2, "flip": 0, "sbl1Ver": "B3.2.02_PPUB", "stublVer": "B3.2.02_PPUB", "efuse": 1, "blType": 1, "enforce": 2, "lastRst": "200000001", "recov": "linux+2.1.6_lock-1+lewis-release-rt419+12", "idSwitch": 0}, "sku": "i755840", "softwareVer": "lewis+3.10.8+lewis-release-rt320+13", "subModSwVer": {"nav": "lewis-nav+3.10.8-EPMF+build-HEAD-fed1cd6fdd3+13", "mob": "3.10.8+build-HEAD-fed1cd6fdd3+13", "pwr": "0.5.3+build-HEAD-fed1cd6fdd3+13", "sft": "1.1.0+Lewis-Builds/Lewis-Certified-Safety/lewis-safety-bbbe81f2c82+21", "mobBtl": "4.2", "linux": "linux+2.4.2+lewis-release-rt320+13", "con": "2.4.0-@071b7851/build"}, "svcEndpoints": {"svcDeplId": "v007"}, "timezone": "Europe/Berlin", "tls": {"tzbChk": 1, "privKType": 2, "lcCiphers": [0, 0, 0, 0, 0, 0, 0, 50380848, 50380847, 50331708]}, "twoPass": false, "tz": {"events": [{"dt": 1604232000, "off": 60}, {"dt": 1616893201, "off": 120}, {"dt": 1635642001, "off": 60}], "ver": 9}, "vacHigh": false, "wDevLoc": false}
Hi,
maximale Anzahl von Schedules beim i7: Ich habe gerade mal fleissig Zeitpläne eingerichtet - der i7 kann maximal 14 Stück speichern.
LG,
Hermann
Hallo,
ich experimentiere gerade einfach ein wenig, und bräuchte einen kleinen Tipp...ich möchte die Funktion "readingsDelete" aufrufen, um fallweise ein Reading meines i7 zu löschen:
main::readingsDelete($name, "Schedule".$nsched."Enabled")
Offenbar möchte readingsDelete lt. API Beschreibung aber eine Hashreferenz
readingsDelete($hash, $reading);
Ich bin noch nicht firm genug in Perl, und verstehe nicht ganz wie ich vom Namen des Robots $name zu einem Hash komme - und mir ist auch nicht ganz klar warum readingsDelete einen hash braucht, während z.B. ReadingsVal statt hash "nur" den Namen braucht.
Sorry wenn die Frage trivial ist...
Hermann
Erst einmal ist es nicht ganz trivial, so etwas aus den RoombaUtils aufzurufen - da die selber schon innerhalb einer Schleife laufen, die Readings setzt. Besser ist, einen Aufruf
fhem("deleterading <name> <reading>")
abzusetzen.
Zweitens: $defs{"<name>"}
ist der Hash.
LG
pah
@pah: Dankeschön! Mit
my $hash = $main::defs{$name};
komme ich vermutlich weiter ;)
Noch 2 Findings, bei denen sich der i7 offenbar von den anderen Modellen unterscheidet:
Es gibt drei "uncaught events":
Zitat
uncaught event {"state":{"reported":{"bbswitch": ...
uncaught event {"state":{"reported":{"mssnNavStats":...
uncaught event {"state":{"reported":{"lastDisconnect": 2}}}
Die beide ersten habe ich mal bei "do nothing" ergänzt, für das "lastDisconnect" baue ich mir mal eine Routine.
Und beim missionmanager ist der normale i7 Ablauf wohl
charge -> run -> hmPostMsn -> evac -> hmPostMsn -> run -> charge
Das erklärt, warum bei mir nach jedem Lauf disconnectAfter weiter auf 300 sitzt. Ich habe das elsif mal erweitert um
|| $oldphase.$phase eq "runcharge"
(noch nicht getestet - gute Nacht ;) )
Ich habe meine Routine für die i7 Schedules aktualisiert (Maximalanzahl der Zeitpläne, Readings alter Zeitpläne löschen):
https://forum.fhem.de/index.php/topic,114166.msg1137830.html#msg1137830
@pah: Sorry, basiert nicht auf Deiner letzten Testversion, da ich die nicht zum Laufen gebracht habe :(, aber ich wollte einfach wissen obs geht, und evtl. freut sich zwischenzeitlich jemand drüber.
LG,
Hermann
Hallo,
ich habe immer wieder Perl Warnings im Log aus den RoombaUtils:
PERL WARNING: Use of uninitialized value in numeric eq (==) at ./FHEM/99_RoombaUtilsI7.pm line 671
PERL WARNING: Use of uninitialized value in subtraction (-) at ./FHEM/99_RoombaUtilsI7.pm line 676
PERL WARNING: Use of uninitialized value in subtraction (-) at ./FHEM/99_RoombaUtilsI7.pm line 677
Die lines sind aus "meiner" Testversion (deshalb "RoombaUtilsI7", aber selbstverständlich mit kompletter Nennung des honorierten Autors!) und beziehen sich auf die pose subroutine:
if($hash->{helper}{initmap}==1){
$hash->{helper}{startx} = $px;
$hash->{helper}{starty} = $py;
$hash->{helper}{initmap}=0;
}
$px -= $hash->{helper}{startx};
$py -= $hash->{helper}{starty};
Was passiert ist möglicherweise, dass eine Nachricht vom Device kommt mit "pose", aber vorher die sub "initmap" nicht aufgerufen wurde, weil kein "cleanMissionStatus" vorher empfangen wurde (kann z.B. beim fhem restart passieren).
Könnte man das am Anfang der pose abfangen? Z.B. mit so was wie
if (!$hash->{helper}{initmap}) return;
(Evtl. ein brachialer Vorschlag, aber ich denke nur laut...)
Ich hatte auch schon den Fall, dass wohl gar ein pose kommt, und sich die Calc.pm beschwert bzw verabschiedet in line 329:
PERL WARNING: Use of uninitialized value in multiplication (*) at /usr/local/share/perl/5.30.0/Math/Polygon/Calc.pm line 323
PERL WARNING: Use of uninitialized value in addition (+) at /usr/local/share/perl/5.30.0/Math/Polygon/Calc.pm line 324
PERL WARNING: Use of uninitialized value in addition (+) at /usr/local/share/perl/5.30.0/Math/Polygon/Calc.pm line 325
Illegal division by zero at /usr/local/share/perl/5.30.0/Math/Polygon/Calc.pm line 329
Dann wird "cmPhase" wohl nicht mehr gesetzt, und es entsteht eine loop (zumindest habe ich die "division by zero" dann eine halbe Stunde im Minutentakt im Log), weil er die Meldung nicht mehr komplett auswertet und phase nicht neu setzt - vermute ich. Evtl. kann man das auf die selbe Art lösen - ich übe weiter, bin aber für jeden Denkanstoß dankbar.
LG,
Hermann
Hallo,
kann mir jemand sagen welches die funktionierende Version der 99_RoombaUtils.pm ist. Habe die beiden letzten von PAH probiert.
Oder liegt mein Fehler woanders?
i7
Log
2021.04.06 17:31:01.526 5: PutzfeeClient: sending PINGREQ (192)(0)
2021.04.06 17:31:01.648 5: PutzfeeClient: received PINGRESP
2021.04.06 17:31:19.698 3: MQTT2_DEVICE set Putzfee start
2021.04.06 17:31:19.699 1: ERROR evaluating my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $NAME= $evalSpecials->{'%NAME'};{roomba::command($NAME,"start",$EVENT)}: Undefined subroutine &roomba::command called at (eval 2708) line 1.
2021.04.06 17:31:19.699 5: PutzfeeClient: sending PUBLISH 0E(0)(9)Undefinedsubroutine &roomba::command called at (eval 2708) line 1.(10)
list Putzfee
Internals:
CID XXXXX
DEF XXXXX
DEVICETOPIC XXXXX
FUUID 6033ce97-f33f-9eb8-adc1-9ca1b8486c2f6f1a
FVERSION 10_MQTT2_DEVICE.pm:0.238430/2021-02-27
IODev PutzfeeClient
LASTInputDev PutzfeeClient
MSGCNT 22
NAME Putzfee
NR 588
PutzfeeClient_MSGCNT 22
PutzfeeClient_TIME 2021-04-06 17:39:33
STATE start
TYPE MQTT2_DEVICE
READINGS:
2021-04-06 17:31:19 state start
Attributes:
IODev PutzfeeClient
autocreate 1
devicetopic XXXXXX
readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
room MQTT2_DEVICE
setList start:noArg {roomba::command($NAME,"start",$EVENT)}
stop:noArg {roomba::command($NAME,"stop",$EVENT)}
dock:noArg {roomba::command($NAME,"dock",$EVENT)}
resume:noArg {roomba::command($NAME,"resume",$EVENT)}
pause:noArg {roomba::command($NAME,"pause",$EVENT)}
CarpetBoost:true,false {roomba::setting($NAME,"carpetBoost",$EVENT)}
TwoPass:true,false {roomba::setting($NAME,"twoPass",$EVENT)}
NoAutoPasses:true,false {roomba::setting($NAME,"noAutoPasses",$EVENT)}
NoPP:true,false {roomba::setting($NAME,"noPP",$EVENT)}
VacHigh:true,false {roomba::setting($NAME,"vacHigh",$EVENT)}
BinPause:true,false {roomba::setting($NAME,"binPause",$EVENT)}
OpenOnly:true,false {roomba::setting($NAME,"openOnly",$EVENT)}
ProgHold:true,false {roomba::setting($NAME,"schedHold",$EVENT)}
ProgSun:time {roomba::setsched($NAME,0,$EVENT)}
ProgMon:time {roomba::setsched($NAME,1,$EVENT)}
ProgTue:time {roomba::setsched($NAME,2,$EVENT)}
ProgWed:time {roomba::setsched($NAME,3,$EVENT)}
ProgThu:time {roomba::setsched($NAME,4,$EVENT)}
ProgFri:time {roomba::setsched($NAME,5,$EVENT)}
ProgSat:time {roomba::setsched($NAME,6,$EVENT)}
maplist:noArg {roomba::setting($NAME,"local:cmMapList={listmaps('$NAME')}",$EVENT)}
mapdel {roomba::setting($NAME,"local:cmMapList={delmap('$NAME','$EVENT')}",$EVENT)}
list PutzfeeClient
Internals:
BUF
Clients :MQTT2_DEVICE:MQTT_GENERIC_BRIDGE:
ClientsKeepOrder 1
DEF X.X.X.X:8883
DeviceName X.X.X.X:8883
FD 157
FUUID 6033ce2e-f33f-9eb9-1550-748e3271959ff7c7
FVERSION 00_MQTT2_CLIENT.pm:0.238990/2021-03-06
NAME PutzfeeClient
NR 587
PARTIAL
SSL 1
STATE opened
TYPE MQTT2_CLIENT
WBCallback
clientId XXXXX
lastMsgTime 1617723755.80805
nextOpenDelay 5
MatchList:
1:MQTT2_DEVICE ^.
2:MQTT_GENERIC_BRIDGE ^.
READINGS:
2021-04-06 17:26:29 state opened
sslargs:
SSL_version SSLv23
Attributes:
SSL 1
autocreate no
clientId XXXXX
mqttVersion 3.1.1
room MQTT2_DEVICE
sslargs SSL_version:SSLv23
username XXXXX
verbose 5
Gruß
Eisix
Hi,
Du müsstest im Forum etwas zurückgehen, oder die aus dem svn nehmen, die letzten Versionen laufen bei mir auch nicht.
Ich habe inzwischen etwas weiter dran gebaut, und versucht nix kaputt zu machen, dafür ein paar zumindest für mich nützliche Funktionen einzubauen (SysUptime, Runtime, einen ChargeState (weil mich "Wird geladen (100%)" irgendwie stört und ich "Geladen (100%)" korrekter finde), die cleanRoom Routinen von delMar integriert, ein paar unknowns abgefangen, den Logtext bei "finalization" korrigiert, ein catchall eingebaut um einfach mal alle verfügbaren Readings zu bekommen etc...).
Ich packe meine Version mal hier rein - als "RoombaUtilsI7", bitte als Ergänzung auffassen, ich will keinesfalls so tun als wäre das meine Leistung, die Ehre gehört pah! Deshalb auch als "I7" - sollte aber auch bei den anderen Fegern funktionieren. Ich schreibe demnächst mal zusammen was ich ausprobiert habe, ist im code aber alles sauber mit "#hapege ... #/hapege" geklammert. Da sind noch einige Codestellen drin mit denen ich rumspiele, also lacht mich bitte nicht aus ;-)
Zur Verwendung in fhem einfach den Aufruf "roomba" durch "roombaI7" ersetzen, z.B.
start:noArg {roombaI7::command($NAME,"start",$EVENT)}
So kann man weiter parallel bzw hauptsächlich pahs Original verwenden und zum Testen oder für einen I7 relativ einfach auf meine Testversion umschalten.
Have fun...
Hermann
Also, hier passiert gerade etwas Ungesundes, das wir mit FHEM seit vielen Jahren zu vermeiden versuchen - nämlich die halbparallele Entwicklung von Software.
Da ich mit dem I7 nicht testen kann, bin ich auf Mithilfe angewiesen, prima, Danke an hapege.
Ebenfalls Danke für die Behebung von ein paar kleinen Ungenauigkeiten
Gleichzeitig werden aber in der "RoombaUtilsI7.pm" dann Änderungen vorgenommen, die ganz andere Bereiche betreffen. Neue Readings erfunden, die wohl überlegte Syntax verändert etc.
Das bedeutet: Wenn ich nicht komplett die Kontrolle verlieren will, muss ich mit hohem Aufwand jeweils überlegen, was das bedeutet oder nicht bedeutet.
Das sollten wir _bitte_ so nicht weiter machen
Ich habe jetzt mal eine konsolidierte Version erstellt, die viele (nicht alle) der Änderungen von hapege übernommen hat und für beide Systeme laufen sollte. Noch nicht ganz - beispielsweise wird - mutmaßlich wegen der Umbauten - im Moment bei mir kein FinalizeMap ausgelöst, muss erst herausfinden, woran das liegt.
Bitte mal wegen der I7-Routinen testen, das ist jetzt sozuagen wieder auf Alpha-Status zurückgefallen.
LG
pah
Hallo,
glaube bei mir liegt das Problem noch irgendwo anders. Die Routinen aus den RoombaUtils werden nicht gefunden.
2021.04.07 16:42:54.680 3: MQTT2_DEVICE set Putzfee start
2021.04.07 16:42:54.681 1: ERROR evaluating my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $NAME= $evalSpecials->{'%NAME'};{roomba::command($NAME,"start",$EVENT)}: Undefined subroutine &roomba::command called at (eval 2895) line 1.
Restart habe ich gemacht
/opt/fhem/FHEM# ls -ltr 99_RoombaUtils.pm
-rw-r--r-- 1 fhem dialout 53508 Apr 7 16:36 99_RoombaUtils.pm
fehlt mir noch irgendeine Perl dependency, oder habe ich sonst noch etwas vergessen?
Gruß
Eisix
Was sagt denn das Log bei einem
reload 99_RoombaUtils
??
LG
pah
Jep, wie befürchtet
reload 99_RoombaUtils
Can't locate Math/Polygon/Calc.pm in @INC (you may need to install the Math::Polygon::Calc module) (@INC contains: ./lib ./FHEM . /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.0 /usr/local/share/perl/5.30.0 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base ./FHEM/lib) at ./FHEM/99_RoombaUtils.pm line 50.
BEGIN failed--compilation aborted at ./FHEM/99_RoombaUtils.pm line 50.
Die zwei haben bei mir gefehlt
cpanm Math::Polygon::Calc Math::ConvexHull
Funktioniert jetzt, danke!
Jetzt muss ich aber mal nachschauen ob meine Frau den Schock vom meinem ersten Befehl (Dock) überstanden hat. Das Absaugen ist ganz schön laut.
Gruß
Eisix
Steht "sVacHigh" auf false? Reduziert den Lärm deutlich.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 07 April 2021, 16:19:11
zu vermeiden versuchen - nämlich die halbparallele Entwicklung von Software.
Wohl schon an anderen Stellen diskutiert, deshalb nur kurz der Vollständigkeit halber:
die Git basierten Platformen machen das sehr einfach.
der Knackpunkt: das Mergen in Git ist intelligenter, da es nicht zwei Code-Stände miteinander vergleicht, sondern den Zeitpunkt des Branchings (also wann haben sich die Code-Zweige getrennt) ebenfalls mit einbezogen wird. Sehr oft ist das Zusammenführen dann nur noch eine Frage von ein- zwei Mausklicks, anstatt manuellem Merge im lokalen Editor.
Die Komplexität kann anfangs erschlagen, im Context der Roomba Entwicklung hier würde es aber nur zwei oder drei Dinge geben, die man sich als Entwickler (und Eigentümer) aneignen muss.
Klugscheissen will ich hier aber nicht, ich wollte es nur ins Bewusstsein rufen (Fragen dazu gern per PM, diesen Thread wollen wir aber sauber halten)
Tatsächlich werde ich mir heute noch die Zeit nehmen, die i7 Features aus der letzten Version hier zu checken ;-)
Danke an Alle
In studentischen Projekten - von denen ich derzeit etwa 10 betreue - nehme ich natürlich Github. Aber da muss ich den Code auch nicht komplett verstehen, weil ich nicht Maintainer bin.
DAS macht den wesentlichen Unterschied aus - nicht das Mergen.
Zum Mergen habe ich ein sehr komfortables Tool, das zusammen mit dem oXygen XML-Editor kommt (den ich auch für Perl nutze).
Mir fehlt aber noch das Tool, das die Gedankengänge anderer Programmersteller an meine Gedankengänge anpasst. Oder umgekehrt.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 07 April 2021, 16:19:11
Bitte mal wegen der I7-Routinen testen, das ist jetzt sozuagen wieder auf Alpha-Status zurückgefallen.
Einzelraumreinigung funktioniert nach wie vor
Danke!
schöne Grüße
Martin
Hallo pah,
erst mal sorry, ich wollte weder etwas Ungesundes tun, noch gegen Regeln verstoßen, noch Dir Mehrarbeit bescheren! Die offensichtlich "ungesunde" Version habe ich als Spiel- oder Testversion gesehen, eher aus der Not geboren meinen I7 einsetzen und verstehen zu wollen. Ich habe mich bemüht mich an Deine Syntax zu halten, was offensichtlich nicht gelungen ist. Ja, ich habe ein paar mir subjektiv nützlich scheinende Dinge eingebaut und ausprobiert, sorry dass ich das nicht genauer dokumentiert habe. Ich kann gerne noch was dazu schreiben, mir ist schon klar dass das nicht perfekt ist.
Wie ist denn das richtige Vorgehen? Jede Änderung bzw Vorschlag hier posten und diskutieren? Klar, gerne! Ich will keinen Ärger verursachen, nur lernen und soweit möglich ein wenig helfen...(und passe mich gerne an Deine Gedankengänge an, das sollte das passende Tool sein ;) )
Danke fürs Aufräumen! (Ich komme erst am Wochenende dazu etwas zu testen)
LG,
hapege
PS: Das nicht-Auslösen von finalizemap habe ich auch, wenn ich einen Reinigungsvorgang in einem anderen Stockwerk auslöse und der Roomba das Dock dann halt nicht findet. Das ist der Grund für das gebastelte "finalizemapnow", damit habe ich das dann nachträglich getriggert. Geht sicher eleganter.)
No offense taken, und um mich zu ärgern, bedarf es nach > 40 Jahren in der Lehre und in der Politik deutlich mehr Aufwand...
Allerdings wäre es sinnvoller, die Dinge zu trennen:
- Notwendige und sinnvolle Ergänzungen zum Code
- Experimentelle und/oder individuelle Anpassungen.
Zum Nutzen des "finalizemapnow" habe ich mir z.B. einen Wolf gesucht.
LG
pah
Hallo pah,
klingt sinnvoll, und sorry für den Wolf...
Darf ich eine kurze Verständnisfrage stellen?
Die sub "schedule2" hat 3 Übergabeparameter (line 753), die auch ausgewertet werden:
sub schedule2($$$){
...
my ($name,$evtptr,$retptr) = @_;
...
Aufgerufen wird sie aber nur mit 2 Parametern (Zeile 484):
schedule2(\%cleans,\%ret);
Ich dachte, der erste Param wäre nötig, um $name zu übergeben, aber offenbar
- stört die Diskrepanz in der Anzahl der Parameter nicht
- brauchts die Übergabe von $name nicht, z.B. die "ReadingsVal" funktionieren dennoch (wo wird dann $name überhaupt gefüllt? Ich bin verwirrt...)
Ich verstehe nicht, warum das funktioniert...
Danke schon mal,
hapege
OK,
war zu spät gestern, mein Fehler - es funktioniert ja auch nicht :-(
my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Not a HASH reference at ./FHEM/99_RoombaUtils.pm line 483.
Vermutlich weil cleanSchedule2 so aussieht:
"cleanSchedule2": [{"enabled": false, "type": 0, "start": {"day": [1], "hour": 9, "min": 0}, "cmd": {"command": "start", "ordered": 1, "pmap_id": "zBzSo0ghQ-SYfM7yqTxZUg", "regions": [{"region_id": "12", "type": "rid"}], "user_pmapv_id": "210327T093901"}}, {"enabled": false, "type": 0, "start": {"day": [2, 4, 6], "hour": 11, "min": 0}, "cmd": {"command": "start", "ordered": 1, "pmap_id": "zBzSo0ghQ-SYfM7yqTxZUg", "regions": [{"region_id": "12", "type": "rid"}, {"region_id": "6", "type": "rid"}, {"region_id": "8", "type": "rid"}, {"region_id": "10", "type": "rid"}], "user_pmapv_id": "210327T093901"}}]
Deshalb habe ich das so versucht:
...
#-- for i7
}elsif( defined($1) && $1 eq "2" ){
my %cleans = %{$staterep};
schedule2($name,\%cleans,\%ret);
}
Und in der sub schedule2 ($$$) dann halt überall statt "$evtptr->..." -> "$evtptr->{'cleanSchedule2'}->...", z.B.
$enabled[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'enabled'};
Das ist halt nicht ganz konform mit Deiner Systematik.
LG,
Hermann
Jetzt verstehe ich nicht so ganz - funktioniert das mit der Anzeige von Schedule in der konsolidierten Version nun, oder nicht?
LG
pah
Hi,
nein, funktioniert nicht, Fehler im Log:
my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Not a HASH reference at ./FHEM/99_RoombaUtils.pm line 483.
Mit der Anpassung von oben
...
#-- for i7
}elsif( defined($1) && $1 eq "2" ){
my %cleans = %{$staterep};
schedule2($name,\%cleans,\%ret);
}
und in schedule2($$$)
$enabled[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'enabled'};
# dito die anderen Stellen mit $evtpr->
funktioniert es.
Ich habe gerade eine CleanRoom gestartet, klappt, inkl. finalizemap.
LG,
hapege
Die erste Anpassung hatte ich in meiner letzten Fassung schon drin:
Zitatif( $evt =~ /cleanSchedule(2?)/){
#main::Log 1,"[RoombaUtils] schedule event ".$evt;
#-- older devices
if( !defined($1) || $1 ne "2" ){
my %cleans = %{$staterep->{'cleanSchedule'}};
schedule($name,\%cleans,\%ret);
#-- for i7
}elsif( defined($1) && $1 eq "2" ){
my %cleans = %{$staterep->{'cleanSchedule2'}};
schedule2($name,\%cleans,\%ret);
}
}
Allerding wundert mich, dass es mit
Zitat$starthour[$i] = $evtptr->[$i]->{'start'}->{'hour'};
nicht gehen soll.
LG
pah
Hi pah,
also in der letzten Version die ich hier finde (vom 7.4.: https://forum.fhem.de/index.php/topic,114166.msg1146569.html#msg1146569) ist die Anpassung nicht drin, da steht noch
#-- for i7
}elsif( defined($1) && $1 eq "2" ){
my %cleans = %{$staterep->{'cleanSchedule2'}};
schedule2(\%cleans,\%ret);
}
i.e. ohne "$name".
Und ich habs gerade nochmal probiert, mit
my %cleans = %{$staterep->{'cleanSchedule2'}};
kommt es zu dem beschriebenen Fehler, mit
my %cleans = %{$staterep};
klappt es - dann muss in der sub aber das "cleanSchedule" eingebaut werden:
$enabled[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'enabled'};
Ich kann nur laienhaft spekulieren, in der message hinter "cleanSchedule2" kommt so was wie ein array "[...]", das scheint dann mit der hash reference nicht zu korrspondieren.
Ich kann gerne noch was anderes ausprobieren...
LG,
hapege
Nene, nix laienhaft, das ist eben keine Hash reference, sondern eine Array reference - habe ich offenbar nicht richtig gelesen.
Das werde ich korrigieren.
LG
pah
Guten Morgen pah,
(wow, sehr-früh-Aufsteher ;-) )
Um sauber zu sein sollte wahrscheinlich auch die "setsched2" aus der Produktivversion herausgenommen werden. Hier habe ich versucht, Zeitpläne der app zu deaktivieren - zieht aber offenbar nicht. Aktuell weiß ich nicht, wie man beim I7 die Zeitpläne setzen oder verändern kann, außer mit der app. Hast Du eine Idee?
Ebenso fairerweise ist es zu erwähnen, dass die "cleanRoom", "createFloor" und "createRoom" von delMar sind, die habe ich nur reinkopiert, alle drei funktionieren.
Was ich noch nützlich finde, auch wenn die Aufnahme von doppeltem code irgendwie schlimm ist, ist die "rewriteSVG". Mich hat gestört, dass "delmap" zwar die map aus dem xml löscht, aber die svg erst aktualisiert wird beim nächsten run - wenn also die svg neu geschrieben wird. Somit wirkt delmap nicht auf die aktuelle Karte. Das geht sicher eleganter als Codeanteile zu kopieren, ich habs aber nicht anders hinbekommen...
Schönen Sonntag,
hapege
Hier ist erst einmal eine Zwischenversion, in welcher die Anzeige von cleanSchedule2 korrigiert ist.
LG
pah
Hi,
Danke, und jein - die schedules werden nun ausgewertet, bbrun (Runtime), bbsys (SysUptime), ChargeState aber nicht mehr.
Reinigungszyklus habe ich nicht probiert, die Katzen schlafen grad so schön ;-)
Danke und schönen Abend,
hapege
Runtime und Sysuptime habe ich rausgeworfen - das sind m.E. keine sinnvollen Daten, weil cmTime schon die Laufzeit für die gegenwärtige Mission enthält.
LG
pah
Hi pah,
na ja, das sind schon ganz andere, zusätzliche Daten:
cmTime = Laufzeit der letzten Mission
Runtime = Gesamtlaufzeit aller bisherigen Missionen
SysUptime = genau das ;-) (wie lange lebt der Robot schon bei mir...)
Ich halte das - klar, ebenfalls subjektive "m.E." - für interessant, aber es ist Dein Modul. Kann sich ja jeder selbst reinkopieren.
LG,
hapege
Meine Arbeit am Roomba wird seit 2 Wochen dadurch blockiert, dass einer meiner beiden Roboter die Zusammenarbeit jetzt komplett verweigert. Mit der App kann ich ihn zwar noch steuern - aber auf jede Kontaktaufnahme seitens FHEM bekomme ich nur
Zitat021.04.26 09:42:58 4: IP: 192.168.0.xx -> 192.168.0.xx
2021.04.26 09:43:01 4: HttpUtils: https://192.168.0.48:8883/: Can't connect(2) to https://192.168.0.xx:8883: SSL wants a read first
Ich habe wirklich jetzt schon jeden Trick probiert - sogar die Kiste komplett zurückgesetzt. Bisher hat noch nichts gewirkt.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 26 April 2021, 09:53:40
Meine Arbeit am Roomba wird seit 2 Wochen dadurch blockiert, dass einer meiner beiden Roboter die Zusammenarbeit jetzt komplett verweigert. Mit der App kann ich ihn zwar noch steuern - aber auf jede Kontaktaufnahme seitens FHEM bekomme ich nur
Ich habe wirklich jetzt schon jeden Trick probiert - sogar die Kiste komplett zurückgesetzt. Bisher hat noch nichts gewirkt.
LG
pah
Hattest Du den TIMEOUT von knorxi mal probiert (wahrscheinlich ja 8)). Der hatte bei mir funktioniert. Hatte gleiches Fehlerbild.
https://forum.fhem.de/index.php/topic,114166.msg1126994.html#msg1126994 (https://forum.fhem.de/index.php/topic,114166.msg1126994.html#msg1126994)
Gruß Michael.
Ich versuche gerade, das irgendwie einzugrenzen, bin aber bis inklusive Donnerstag komplett unter Wasser.
LG
pah
Zitat von: MichaelT am 26 April 2021, 19:54:42
Hattest Du den TIMEOUT von knorxi mal probiert
Ich hab das Problem nicht. Zumindest nicht, dass ich wüsste (obwohl die Reaktion auf ein Start-Kommando gelegentlich länger auf sich warten lässt...)
Trotzdem ein Gedanke:
Ich hab im global sslVersion Attribut TLSv12 drin stehen.
Entsprechend dem Wireshark Screenshot von knorxi hat er auch TLSv12.
Vielleicht ist diese Version auch noch nachgiebiger im Bezug auf dieses Problem.
schöne Grüße
Martin
Es ist ja nicht einfach, mich zu verblüffen - aber mit diesem TIMEOUT klappt es tatsächlich wieder. Danke für den Hinweis, denn das hatte ich eben noch nicht probiert.
LG
pah
Edit: Neueste Nachricht von Rudi König in dieser Sache:
ZitatIch habe dieses Attribut jetzt unter dem Namen connectTimeout in MQTT2_CLIENT eingebaut, allerdings habe ich Schwierigkeiten vorzustellen, warum ein Timeout als "SSL wants a read first" gemeldet wird.
Das heißt: Nach dem nächsten Update muss man ggf. das Attribut TIMEOUT durch connectTimeout ersetzen.
LG
pah
Hi pah,
ich habe einen reprodzierbare Fehlermeldung aus den roombautils bei jedem restart:
2021.05.02 11:25:13 1: PERL WARNING: Use of uninitialized value in multiplication (*) at ./FHEM/99_RoombaUtils.pm line 814.
2021.05.02 11:25:13 3: eval: my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $EVTPART1= $evalSpecials->{'%EVTPART1'};my $EVTPART10=
.....
Ich glaube das auch zu verstehen - in line 814 wird benutzt
$evtptr->{'sqft'}
Und den Wert gibts in der Message vom I7 offenbar nicht:
"cleanMissionStatus": {"cycle": "none", "phase": "charge", "expireM": 0, "rechrgM": 0, "error": 0, "notReady": 0, "mssnM": 0, "expireTm": 0, "rechrgTm": 0, "mssnStrtTm": 1619859625, "initiator": "schedule", "nMssn": 66}
Wenn ich das richtig sehe, wir die sub "mission" nur aufgerufen, wenn ein "cleanMissionStatus" in der Meldung steckt, und da fehlt halt "sqft". Mein I7 hat den Parameter außerhalb der "cleanMissionStatus" in "bbrun":
"bbrun": {"nOvertemps": 0, "nEvacs": 50, "nCBump": 0, "nWStll": 0, "nMBStll": 1203, "nPanics": 153, "nPicks": 271, "nOpticalDD": 2, "nPiezoDD": 0, "nScrubs": 2, "nStuck": 18, [b]"sqft": 131,[/b] "min": 37, "hr": 34, "nCliffsF": 6705, "nCliffsR": 0}
Was ich nicht ganz verstehe: Ich würde den Fehler dann jedes Mal bei einer Message erwarten (sqft fehlt immer, wenn nicht gerade ein Saugvorgang läuft/gelaufen ist), und nicht nur beim Restart. Passiert aber nicht bei jeder Message, also irgendwo hat meine vorsichtige Analyse eine Haken, oder ich übersehe etwas...
Ich habe das in der sub "mission" mal so probiert zu fixen:
# hapege
if(defined($evtptr->{'sqft'})) {
my $sqm = int($evtptr->{'sqft'}*10/10.7639)/10;
main::Log 1,"[RoombaUtils] sqft is defined with value $sqm ";
$retptr->{"cmArea"} = $sqm." m²";
}
# /hapege
und in der sub "bbrun" (die "defined" Abfrage habe ich drin gelassen, falls "sqft" bei anderen Roombas nicht enthalten ist):
sub bbrun {
#-- getting events of the type
# {"state":{"reported":{"bbrun"}}}
my ($evtptr,$retptr) = @_;
my $runh = $evtptr->{'hr'};
my $runm = $evtptr->{'min'};
my $evacs = $evtptr->{'nEvacs'};
$retptr->{"Evacuations"} = $evacs;
$retptr->{"Runtime"} = $runh.":".$runm;
$retptr->{"Runtime2"} = int($runh / 24)."d ".($runh % 24)."h ".$runm."m";
if(defined($evtptr->{'sqft'})) {
my $sqm = int($evtptr->{'sqft'}*10/10.7639)/10;
main::Log 1,"[RoombaUtils] sqft is defined with value $sqm ";
$retptr->{"bbrunArea"} = $sqm." m²";
}
return
}
Damit kriege ich (im testweise eingefügten neuen reading "bbrunArea") den Wert für die Fläche geliefert - ich wollte sehen obs klappt.
Damit ist der Fehler beim restart / in cleanMissionStatus weg.
Schönen Sonntag,
hapege
UPDATE:
Mein I7 hat am 21.4. ein FW update auf 3.14.12 eingespielt. Seit diesem Datum liefert er bei im Rahmen von "cleanMissionStatus" für mssnM und sqft immer "0". Damit ist cmArea und cmTime nun immer "0".
"sqft" bei bbrun ist der gesamte bisher gereinigte Bereich (also Summe aller Mission), allerdings in 10e-2 square feet. Muss also mit 100 multipliziert werden, um die "echten" sqft zu bekommen, bzw für Quadratmeter:
int($evtptr->{'sqft'}*100/10.7639);
Macht die Readings für "RunTime" und "SysUptime" wieder ein bisschen interessanter ;)
@pah: Du könntest in Deinen Berechnung eine "10" herauskürzen, "*(10/10.7639)/10" ist recht identisch zu "/10.7639" ;), oder übersehe ich was?
UPDATE2:
Ich bastle gerade daran, aus der "mssnStrtTm" die Dauer der letzten CleanMission zu berechnen (also das verlorengegangene "cmTime").
Dazu ergänze ich in der sub "mission":
# hapege: get time
my $MissionStartTime = $evtptr->{'mssnStrtTm'};
$hash->{helper}{MissionStartTimeUnix} = $MissionStartTime;
my $cmStartTime = calctime($MissionStartTime);
$retptr->{"cmStartTime"} = $cmStartTime;
# /hapege
Und ergänze in der sub "missionmanager" hiter dem Aufruf der "finalizemap":
# hapege - calculate time
my $missiontime = calctimediff($hash->{helper}{MissionStartTimeUnix});
main::fhem("setreading $name cmTime2 $missiontime");
# /hapege - calculate time
Und definiere zwei neue helper subs:
sub calctime ($){
my ($epoch) = @_;
my $LocalTZ = DateTime::TimeZone->new( name => 'local' );
my $dt = DateTime->from_epoch( epoch => $epoch, time_zone => $LocalTZ );
my $hour = $dt->hour; # 0-23
my $minute = $dt->minute; # 0-59 - also 'min'
my $second = $dt->second; # 0-61 (leap seconds!) - also 'sec'
return $hour.':'.$minute;
}
sub calctimediff ($){
my ($epoch) = @_;
my $now = time;
my $timediff = $now - $epoch;
my $dt = DateTime->from_epoch( epoch => $timediff);
my $hour = $dt->hour; # 0-23
my $minute = $dt->minute; # 0-59 - also 'min'
my $second = $dt->second; # 0-61 (leap seconds!) - also 'sec'
return $hour.':'.$minute;
}
Damit das läuft braucht's noch unter "package" ein
use DateTime;
"cmTime2" kann man noch passender benennen, ich wollte aber nicht zu sehr von pahs Nomenklatur abweichen.
Hallo zusammen,
kurze Frage: Ist es richtig, dass immer, wenn der Roomba einen Job startet und beendet, 2 geänderte Parameter vorhanden sind?
Gruß
Marco
Zitat@pah: Du könntest in Deinen Berechnung eine "10" herauskürzen, "*(10/10.7639)/10" ist recht identisch zu "/10.7639" ;), oder übersehe ich was?
Ja, die Rundung. Die anderen Sachen baue ich bei Gelegenheit gern ein. Allerdings ist bei mir derzeit "Land unter" wegen eines neuen Forschungsprojektes.
Zitatkurze Frage: Ist es richtig, dass immer, wenn der Roomba einen Job startet und beendet, 2 geänderte Parameter vorhanden sind?
Was ist damit gemeint?
LG
pah
Beim Start des Roomba wird der 1. Wert des Parameters geändert, beim Stop der 2. Wert...
Ist das richtig?
Das sind keine "Parameter". Sondern Attribute.
Und ja: Das ist in der verwendeten Version so gewollt. Habe ich zwar inzwischen wieder herausgeworfen, weil es sich als nicht praktikabel herausgestellt hat.
LG
pah
Ok. Danke für die Antwort. Gibt es denn eine aktuellere Version?
Ich habe jetzt unterschiedliche Firmware-Versionen in beiden Robotern :-(
Die ältere Firmware hat noch, so wie es sein soll, die Werte sqft und mssnM im Hash cleanMissionStatus - mit den jeweils aktuellen Daten für die gegenwärtige Mission.
Die neuere Firmware hat die Werte auch im Hash - aber die Daten stehen fest auf 0.
Das ist ganz klar ein Fehler der Firmware, denn in bbrun gehören sie nun einmal nicht, das ist eben für den Gesamtverlauf bestimmt.
Es würde mich interessieren, ob die beim i7 auch noch vorhanden, aber fest auf 0 sind.
LG
pah
Hi,
beim I7 ist "mssM" im hash "cleanMissionStatus" vorhanden, aber immer "0".
sqft fehlt im hash "cleanMissionStatus", weshalb es in der sub "mission" zu einer Fehlermeldung kommt, die ich so abfange:
if(defined($evtptr->{'sqft'})) {
my $sqm = int($evtptr->{'sqft'}*10/10.7639)/10);
main::Log 1,"[RoombaUtils] sqft is defined with value $sqm ";
$retptr->{"cmArea"} = $sqm." m²";
}
Ich berechne gerade
- die Laufzeit der mission aus "mssnStrtTm" (einfach die Differenz bilden aus mssnStrtTm und aktueller Zweit) sowie
- die Fläche über "sqft" aus bbrun (Differenz nachher minus vorher)
Klappt zumindest.
Beste Grüße,
Hermann
PS: Ich arbeite gerade an der Möglichkeit, die Schedules des I7 zu setzen bzw si zu de-/aktivieren - hakelt noch ein wenig ;-)
Zitat von: delMar am 06 Februar 2021, 14:51:30
Ich nun wieder mit der Raum-Sache:
Mit dieser Änderung sind alle Variablen aus 99_RoombaUtils verschwunden und somit sollten diese Methoden eigentlich stabil sein.
Ständiger Wartungsaufwand und FHEM Restarts bei Änderungen sind also nicht mehr nötig.
schöne Grüße Martin
Hallo Martin,
danke, das klappt. Zwei Fragen:
1.)
Sind Umlaute tatsächlich ein Problem in 2021 oder nennst Du die Küche aus anderen Gründen Kueche? erledigt: room_label und Name in der App sind unabhängig voneinander. Kann in der App ruhig Küche heissen
edit 2.)
Flur hinten habe ich versucht mit Flur%20hinten zu erstellen. Leider erfolglos. Muss ich den ind er App umbenennen? erledigt: room_label und Name in der App sind unabhängig voneinander.
Ein Hinweis: nachdem ich Küche in Kueche in der App umbenannt habe hat sich
lastCommand_user_pmapv_id
auf das aktuelle Datum/Zeit geändert, womit dann das starten der Raumreinigung aus FHEM nicht mehr funktioniert, bis es in den Attributen angepasst wird.
könnte man die aktuelle Version der Karte nicht abfragen und übernehmen?
Grüße Stefan
Hi Stefan ;-)
Du könntest Dir ein notify anlegen, welches das reading "Schedule1UserPMapvID" bei Änderung ins entsprechende Attribut schreibt. Generisch ist schwierig, weil Du das Attribut ja selbst erstellst und benennst. Und wenn Du mehrere Stockwerke = mehrere Maps hast, dann gibt es mehrere Attribute, und es ist nicht klar welche UserPMapvID in welches Attribut geschrieben werden muss (die Reihenfolge sprich Nummerierung der Schedules in "cleanSchedule2" ändert die app leider immer wieder mal).
Beste Grüße,
Hermann
Hallo,
Thema "app und fehm können nciht gleichzeitig auf den Roomba zugreifen": Ich war bisher der Meinung, und so hat sich das auch bei mir verhalten, dass fhem sich nicht mit dem Roomba verbinden kann solange die App aktiv ist. Zumindest kam bei mir immer ein Connection refused der httpUtils. Nach einer kleinen Diskussion mit Stefan_Hvr (bei dem ein paralleler Zugriff klappt) habe ich folgendes gemacht:
- ein zweites Device (Smartphone) per App mit dem Roomba gekoppelt
- einmal ProgHold (bzw "sSchedHold" via RoombaUtils) auf true und wieder auf false gesetzt
und Voila - App und fhem verbinden sich parallel mit dem Roomba, ein Start in fhem wird sofort in der App auch angezeigt, kein Connection refused mehr etc.
Evtl. war das vorher nur ein Problem bei mir, aber ich dachte das könnte auch für andere von Interesse sein.
Beste Grüße,
Hermann
Und nochmal hallo,
ich habe eine Routine gebastelt, die die Schedules im I7 setzen kann (man möge dem Laien die eine oder andere Unelegantheit im Code verzeihen ;-) ):
sub setschedI7 ($$$){
#my $cmd = 'delta {"state":{"cleanSchedule2":
# [{"enabled": true, "type": 0,
# "start": {"day": [2, 4, 6], "hour": 11, "min": 0},
# "cmd": {"command": "start", "ordered": 1, "pmap_id": "z....g",
# "regions": [{"region_id": "10", "type": "rid"},
# {"region_id": "6", "type": "rid"},
# {"region_id": "5", "type": "rid"},
# {"region_id": "8", "type": "rid"}],
# "user_pmapv_id": "2....7"}}]}}
#
my ($name,$which,$data) = @_;
my @time;
my @hour;
my @min;
my @days;
my @daysnum;
my @pMapId;
my @userPmapvId;
my $cmdpre = 'delta {"state": {"cleanSchedule2": [';
my $cmdpost = ']}}';
my @cmdsched="";
my @cmdregs="";
my @enabled = "";
my @setenable = split(' ',$data);
my $numofsched = main::ReadingsVal($name,"NumOfSchedules","0");
my @numofreg;
my $cmd = $cmdpre;
for (my $i=1; $i<=$numofsched; $i++) {
if ($i==$which or $which=="all") {
$enabled[$i] = $setenable[1];
#main::Log 1,"[RoombaUtils] Schedule $i is $enabled[$i] with which $which";
}
else {
$enabled[$i] = yesnotobool(main::ReadingsVal($name,"Schedule".$i."Enabled",undef));
#main::Log 1,"[RoombaUtils] Schedule $i is $enabled[$i] with which $which";
}
@time = split(":",main::ReadingsVal($name,"Schedule".$i."Time",undef));
$hour[$i] = $time[0];
$min[$i] = $time[1];
# strip leading zero, otherwise Roomba won't accept
$min[$i] =~ s/^0//g;
$days[$i] = main::ReadingsVal($name,"Schedule".$i."WeekDays",undef);
$days[$i] =~ s/So/0/g;
$days[$i] =~ s/Mo/1/g;
$days[$i] =~ s/Di/2/g;
$days[$i] =~ s/Mi/3/g;
$days[$i] =~ s/Do/4/g;
$days[$i] =~ s/Fr/5/g;
$days[$i] =~ s/Sa/6/g;
$pMapId[$i] = main::ReadingsVal($name,"Schedule".$i."PMapID",undef);
$userPmapvId[$i] = main::ReadingsVal($name,"Schedule".$i."UserPMapvID",undef);
#main::Log 1,"[RoombaUtils] Schedule $i, hour: $hour[$i], min: $min[$i], days: $days[$i], pMapID: $pMapId[$i], UserpMapvID: $userPmapvId[$i]";
$numofreg[$i] = main::ReadingsVal($name,"Schedule".$i."NumOfRegions",undef);
$cmdregs[$i]="";
for ( my $j=1; $j<=$numofreg[$i]; $j++) {
$cmdregs[$i] = $cmdregs[$i].'{"region_id": "'.main::ReadingsVal($name,"Schedule".$i."Region".$j,undef).'", "type": "rid"}';
if ( $j < $numofreg[$i] ) {$cmdregs[$i] = $cmdregs[$i].', '}
}
$cmdsched[$i] = "";
$cmdsched[$i] = '{"enabled": '.$enabled[$i].', "type": 0, "start": {"day": ['.$days[$i].'], "hour": '.$hour[$i].', "min": '.$min[$i].'}, "cmd": {"command": "start", "ordered": 1, "pmap_id": "'.$pMapId[$i].'", "regions": ['.$cmdregs[$i].'], "user_pmapv_id": "'.$userPmapvId[$i].'"}}';
$cmd = $cmd.$cmdsched[$i];
if ( $i < $numofsched ) {$cmd = $cmd.', '}
}
$cmd = $cmd.$cmdpost;
main::Log 1,"[RoombaUtils] Command: $cmd";
#return;
return $cmd;
}
(Zur Kontrolle wird das delta command via "main::Log 1,"[RoombaUtils] Command: $cmd";" ins Log geschrieben).
Dazu musste ich meine sub schedule2 erweitern, um die Regions auslesen zu können:
sub schedule2($$$){
#-- getting events of the type
# {"state":{"reported":{"cleanSchedule2": [{"enabled": true, "type": 0,
# "start": {"day": [2, 4, 6], "hour": 11, "min": 0},
# "cmd": {"command": "start", "ordered": 1, "pmap_id": "z...g",
# "regions": [{"region_id": "10", "type": "rid"}, {"region_id": "6", "type": "rid"},
# {"region_id": "5", "type": "rid"}, {"region_id": "8", "type": "rid"}],
# "user_pmapv_id": "2...7"}}]}}}
#my ($dec) = @_;
my ($name,$evtptr,$retptr) = @_;
my @weekdays = ("So","Mo","Di","Mi","Do","Fr","Sa");
my @enabled;
my @starthour;
my @startmin;
my @startday;
my @userpmapvid;
my @pmapid;
my @region;
my $nsched;
my $nreg;
my %answer = ();
my $oldnreg;
my $oldnsched = main::ReadingsVal($name,"NumOfSchedules","");
for (my $i = 0; $i<14; $i++){
# j is needed since @startday does somehow not work with $i...
my $j = $i;
$nsched = $i+1;
$enabled[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'enabled'};
# if schedules are no longer present in app or roomba, delete them in fhem, too
if(!defined($enabled[$i])) {
$retptr->{"NumOfSchedules"} = $i;
for (my $k = $i; $k < $oldnsched; $k++) {
main::Log 1,"[RoombaUtils] deleting old schedule ID $k, oldnsched No was $oldnsched";
my $hash = $main::defs{$name};
my $todel = $k+1;
main::readingsDelete($hash, "Schedule".$todel."Enabled");
main::readingsDelete($hash, "Schedule".$todel."Time");
main::readingsDelete($hash, "Schedule".$todel."UserPMapvID");
main::readingsDelete($hash, "Schedule".$todel."PMapID");
main::readingsDelete($hash, "Schedule".$todel."WeekDays");
}
last;
}
$retptr->{"Schedule".$nsched."Enabled"} = booltoyesno($enabled[$i]) if(defined($enabled[$i]));
$starthour[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'start'}->{'hour'};
$startmin[$i] = sprintf("%02d", $evtptr->{'cleanSchedule2'}->[$i]->{'start'}->{'min'});
$retptr->{"Schedule".$nsched."Time"} = $starthour[$i].":".$startmin[$i] if(defined($starthour[$i]));
$userpmapvid[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'user_pmapv_id'};
$retptr->{"Schedule".$nsched."UserPMapvID"} = $userpmapvid[$i] if(defined($userpmapvid[$i]));
$pmapid[$i] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'pmap_id'};
$retptr->{"Schedule".$nsched."PMapID"} = $pmapid[$i] if(defined($pmapid[$i]));
@startday = @{$evtptr->{'cleanSchedule2'}->[$j]->{'start'}->{'day'}};
for (@startday) {s/0/So/g;s/1/Mo/g;s/2/Di/g;s/3/Mi/g;s/4/Do/g;s/5/Fr/g;s/6/Sa/g;}
$retptr->{"Schedule".$nsched."WeekDays"} = join(", ",@startday);
$oldnreg = main::ReadingsVal($name,"Schedule".$nsched."NumOfRegions","1");
for (my $m = 0; $m < 10; $m++) {
$nreg = $m + 1;
$region[$i][$m] = $evtptr->{'cleanSchedule2'}->[$i]->{'cmd'}->{'regions'}->[$m]->{'region_id'};
$retptr->{"Schedule".$nsched."Region".$nreg} = $region[$i][$m] if(defined($region[$i][$m]));
if(!defined($region[$i][$m])) {
$retptr->{"Schedule".$nsched."NumOfRegions"} = $m;
for (my $k = $m; $k < $oldnreg; $k++) {
main::Log 1,"[RoombaUtils] deleting old region ID $k, oldnreg No was $oldnreg";
my $hash = $main::defs{$name};
my $todel = $k+1;
main::readingsDelete($hash, "Schedule".$nsched."Region".$todel);
}
last;
}
}
}
return
}
In der sub "readings" sieht der Aufruf so aus:
if( $evt =~ /cleanSchedule(2?)/){
#main::Log 1,"[RoombaUtils] schedule event ".$evt;
#-- older devices
if( !defined($1) || $1 ne "2" ){
my %cleans = %{$staterep->{'cleanSchedule'}};
schedule($name,\%cleans,\%ret);
#-- for i7
}elsif( defined($1) && $1 eq "2" ){
my %cleana = %{$staterep};
schedule2($name,\%cleana,\%ret);
}
}
@pah: Sorry, die Übergabeparameter entsprechen nicht Deinem letzten Zwischenstand, da ich mir nicht sicher bin ob Du die Nomenklatur so beibehältst - ich kann das gerne noch anpassen.
Via setlist kann ich nun einzelne oder alle Schedules (de)aktivieren - was sich auch sofort in der App zeigt:
SetScheduleAll:true,false {roomba::setschedI7($NAME,"all",$EVENT)}
SetSchedule1:true,false {roomba::setschedI7($NAME,"1",$EVENT)}
SetSchedule2:true,false {roomba::setschedI7($NAME,"2",$EVENT)}
Geht evtl auch eleganter als für jeden Schedule eine Set, aber mir ist nix anderes eingefallen...
Verbesserungsvorschläge und Kommentare sind gerne willkommen!
Beste Grüße,
Hermann
Hallo Leute,
hat außer mir noch jemand das Problem, dass sein 960er seit dem neuen Firmware-Update (15.06.2021) nicht mehr mit fhem sprechen mag?
Vorher gut drei Monate alles paletti.
Es scheitert auf SSL-Ebene. (HttpUtils: https://192.168.2.47:8883/: Can't connect(2) to https://192.168.2.47:8883: SSL wants a read first
)
Der Stunt aus dem Wiki von wegen [ssl_delfault_sect] rockt scheinbar nicht.
Der Versuch,
- Debian aktualisiert.
- Roombautils frisch geklont.
- fhem aktualisiert.
- debian neu gestartet.
- Roomba resetted.
hat es nicht gebracht.
Es bleibt dabei.
Der Versuch des gettpassword endet immerhin damit, dass auf dieser Ebene die Credentials (IP, BLID, Password) zurückkommen.
Also scheint die Verbindung grundsätzlich zu stehen.
Aber set RoombaFeger connect tut nix. Im Protokoll steht dann weiter:
2021.06.17 19:18:19 5: HttpUtils url=https://192.168.2.47:8883/ NonBlocking via https
2021.06.17 19:18:19 4: IP: 192.168.2.47 -> 192.168.2.47
2021.06.17 19:18:22 4: HttpUtils: https://192.168.2.47:8883/: Can't connect(2) to https://192.168.2.47:8883: SSL wants a read first
Wie kriege ich das Ding aus Sicht fhem wieder zum Leben?
MQTT-Device komplett löschen und neu machen?
Habt Ihr eine schicke Idee dazu?
Das Problem scheint hier der http-Timeout zu sein.
Auf meine Bitte hin hat Rudi König beim MQTT2_CLIENT das Attribut connectTimeout eingebaut - das habe ich bei mir auf 6 gesetzt, damit läuft es wieder.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 17 Juni 2021, 21:05:33
Das Problem scheint hier der http-Timeout zu sein.
Auf meine Bitte hin hat Rudi König beim MQTT2_CLIENT das Attribut connectTimeout eingebaut - das habe ich bei mir auf 6 gesetzt, damit läuft es wieder.
Super, Danke, das scheint zu gehen.
Ich hatte das nicht weiter in Erwägung gezogen, denn bislang war das "normale" verhalten, dass der Client auf den Connect reagiert, aber nach Disconnectafter (seconds) wieder weghört.
Wie jetzt allerdings das Firmware-Update des Roomba (in Zusammenhang mit einem nicht gepatchten fhem, das bis zum Tag des Roomba-Updates klaglos tat) zu genau diesem Problem führte, kann ich als Laie nicht mal mutmaßen.
Hat ein Paar Versuche gebraucht, bis der Python connect wieder zu Stande kam.
Danach dachte ich, iRobot hätte mal wieder irgendwie am SSL gespielt oder so...
Vielleicht hilft's, wenn ich Samstags Lavendel auf die Docking Station des Roomba lege.
Das ist ähnlich mystisch, aber zumindest physisch greifbar!
Danke einstweilen!
Hallo zusammen,
auch mir hat das Update mit dem connectTimeout geholfen! Danke dafür :)
Allerdings scheitere ich gerade an der setList aus dem Wiki (https://wiki.fhem.de/wiki/Roomba#Komfortfunktionen_f.C3.BCr_set-Befehle (https://wiki.fhem.de/wiki/Roomba#Komfortfunktionen_f.C3.BCr_set-Befehle)). Einen Befehl bekomme ich hinzugefügt (ausführen funktioniert), allerdings nicht die gesamte Liste. Versuche ich das, bekomme ich immer einen
syntax error at (eval 3192) line 1, at EOF
wobei das eval von Ausführung zu Ausführung trotz gleichem Code variiert (immer mehr, nicht weniger).
Was mache ich da falsch? Copy/past Fehler kann ich ausschließen, eigentlich auch falsch kopierte Sonderzeichen...
Danke und Gruß!
Außerdem cmPhaseE (battery %) noch in der Status
Zitat von: Cerex am 21 Juni 2021, 18:13:31
Allerdings scheitere ich gerade an der setList aus dem Wiki (https://wiki.fhem.de/wiki/Roomba#Komfortfunktionen_f.C3.BCr_set-Befehle (https://wiki.fhem.de/wiki/Roomba#Komfortfunktionen_f.C3.BCr_set-Befehle)). Einen Befehl bekomme ich hinzugefügt (ausführen funktioniert), allerdings nicht die gesamte Liste. Versuche ich das, bekomme ich immer einen
syntax error at (eval 3192) line 1, at EOF
wobei das eval von Ausführung zu Ausführung trotz gleichem Code variiert (immer mehr, nicht weniger).
Kannst du hier mal reinposten, was du unter
setList reinschreibst? Das kann nämlich unendlich viele Gründe haben.
Zitat von: Cerex am 21 Juni 2021, 18:13:31
Was mache ich da falsch? Copy/past Fehler kann ich ausschließen, eigentlich auch falsch kopierte Sonderzeichen...
Der Code in der Stelle im Wiki ist für die Raw Definition und nicht für den DEF Editor. https://wiki.fhem.de/wiki/Import_von_Code_Snippets
Gruß Otto
Danke für die schnelle Antwort, Otto. Nutze ich (fast ausschließlich), allerdings in dem Fall ohne Erfolg, siehe Anhang. Stehe auf dem Schlauch..
in Zeile zwei ist hinter dem \ noch ein Leerzeichen - lösch das mal weg.
Edit: Ich habe es im Wiki korrigiert. ;)
Haha, funktioniert, tausend Dank :)
Bin etwas irritiert, da ich gestern Abend alles Mögliche durchprobiert hab, mit \, ohne, mit Kommata, ohne ... War wohl spät.
Hast du noch eine Idee bzgl cmPhaseE (battery %)?
ich bin in dem Thread nur zuständig für überflüssige Leerzeichen ;D ;D ;D
Wenn ich das verstehe https://wiki.fhem.de/wiki/Roomba#Komfortfunktionen_f.C3.BCr_Readings
hast Du stateFormat zwar gesetzt aber das Reading selbst fehlt?
EDIT.
Scheint also kein Leerzeichen-Problem zu sein ;D
Mir scheinen die "vereinfachten" Readings zu fehlen bzw. ich habe nur die komplette Liste.
attr RoombaFeger readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
aus der Anleitung hatte irgendwie keine Auswirkung.
Habe es jetzt mal mit Neu-Anlegen des Devices versucht, nur mit dem o.g. Code anstatt
attr RoombaFeger readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
Das hat funktioniert, d.h. habe jetzt die vereinfachten Readings.
EDIT:
battery % fehlt noch, scheint ähnlich zu sein wie hier: https://forum.fhem.de/index.php/topic,114166.msg1119755.html#msg1119755
In sub battery($)
wird batPct abgefragt, aber ich finde keinen Fehler. In den Logs heißt es nur: 2021.06.21 22:55:08 1: [RoombaUtils] uncaught event RoombaFeger
Habe den Eindruck, dass im sub reading($$) das batPct elseif nicht erreicht wird.
EDIT ENDE.
Hier die Readings:
READINGS:
2021-06-21 20:31:15 IODev RoombaFegerClient
2021-06-21 20:36:56 cmArea 0 m²
2021-06-21 20:36:56 cmCycle quick
2021-06-21 20:36:56 cmError None
2021-06-21 20:36:56 cmErrorD Kein Fehler
2021-06-21 20:36:56 cmExpire Never
2021-06-21 20:36:56 cmInitiator localApp
2021-06-21 20:36:16 cmMap initialized
2021-06-21 20:36:56 cmNotReady 0
2021-06-21 20:36:56 cmPhase hmUsrDock
2021-06-21 20:36:56 cmPhaseD Dockingbefehl
2021-06-21 20:36:56 cmPhaseE User Docking
2021-06-21 20:36:56 cmTime 0 min
2021-06-21 20:36:51 lastCommand pause
2021-06-21 20:36:51 lastCommandInitiator localApp
2021-06-21 20:36:56 position (33,9)
2021-06-21 20:36:56 positionTheta 179
2021-06-21 20:36:51 progWeek [Sun:none,Mon:none,Tue:none,Wed:none,Thu:none,Fri:none,Sat:none]
2021-06-21 20:36:55 signalRSSI -32
2021-06-21 20:36:55 state dock
Na, welche Version der RoombaUtils ist das denn ?
LG
pah
Hallo,
verion liefert mir
# $Id: RoombaUtils.pm 2020-09- pahenning $
Durch deinen Hinweis habe ich manuell nachgeschaut, tatsächlich schien meine 99_RoombaUtils.pm veraltet zu sein. Ein UPD FHEM/99_RoombaUtils.pm hat mir dann eine 99_RoombaUtils.pm mit einem Trac Fehler gezogen. Manuell habe ich jetzt die Version 1.0 nach /opt/fhem/FHEM gezogen und ein reload bzw. shutdown restart gemacht.
Leider funktioniert nun auch nicht mehr der connect in RoombaFegerClient. Das verbose 5 spuckt das hier aus:
2021.06.25 21:21:01 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:21:01 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:21:12 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:21:12 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:21:23 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:21:23 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:21:34 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:21:34 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:21:45 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:21:45 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:21:56 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:21:56 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:22:07 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:22:07 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:22:18 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:22:18 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:22:29 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:22:29 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:22:40 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.25 21:22:40 4: IP: 192.168.178.26 -> 192.168.178.26
2021.06.25 21:22:43 4: HttpUtils: 192.168.178.26: Keine Route zum Zielrechner (113)
Hatte auch RoombaFeger neu angelegt, allerdings bzw. konsequenterweise werden die Readings auch nicht angelegt.
Den Fehler hatte ich vorher noch nicht. Der Sauber ist allerdings im Netz erreichbar.
LG!
99_RoombaUtils.pm ist nicht per Update upzudaten...
LG
pah
Hi,
ich habe mir auch etwas schwer getan, die letzte "gültige" Version zu finden...
Offiziell wohl im SVN (ohne i7 Erweiterungen):
https://svn.fhem.de/fhem/trunk/fhem/contrib/Roomba/99_RoombaUtils.pm
Bzw. die letzte im Forum gepostete Version mit ersten Anpassungen für den i7 findet sich in diesem Beitrag:
https://forum.fhem.de/index.php/topic,114166.msg1148069.html#msg1148069
Zumindest ist das mein Kenntnisstand.
In den Beiträgen danach kommen noch ein paar i7 spezifische Korrekturen/Vorschläge, die aber von pah noch nicht abgesegnet bzw noch nicht übernommen worden sind (Bei mir laufen sie, aber ein paar mehr Tests wären sicher qualitätssichernd ;-) )
Der Befehl "version" gibt für die RoombaUtils keinen korrekten Wert zurück, da in der aktuellen 99_RoombaUtils die Zeile
# $Id: RoombaUtils.pm 2020-09- pahenning $
vermutlich nicht richtig formatiert gefüllt ist bzw an der falschen Stelle steht. Zieht man (ich habe das einfach mit anderen files verglichen) die Zeile als zweite Zeile im File nach oben und ergänzt sie ein wenig, dann gibt "version" einen sauberen Eintrag zurück. Ausprobiert mit:
########################################################################################
# $Id: 99_RoombaUtils.pm 123456 2020-09-01 12:00:00Z pahenning $
#
# RoombaUtils
#
# Collection of various routines
# Prof. Dr. Peter A. Henning
# contributions from hapege
#
ergibt bei "version":
99_RoombaUtils.pm 123456 2020-09-01 12:00:00Z pahenning
Ich hoffe das hilft.
Beste Grüße,
Hermann
Hallo und danke für eure Hilfe.
Tatsächlich hat die letzte gepostete Version geholfen. Allerdings musste ich die Prototypen aus den Funktionen entfernen, habe sonst immer "Too many arguments for ..." bekommen. Obwohl die Parameteranzahl gestimmt hatte. Naja.
Musste dazu allerdings neustarten, ein reload alleine scheint nicht funktioniert zu haben.
Jetzt bekomme ich meinen Sauger wieder ausgewertet, allerdings kann ich ihn noch nicht starten. RoombaFegerClient connected nicht. Im Log steht trotz verbose 5 nach wie vor außer dem hier nichts:
2021.06.26 23:21:53 5: HttpUtils url=https://192.168.178.26:8883/ NonBlocking via https
2021.06.26 23:21:53 4: IP: 192.168.178.26 -> 192.168.178.26
Macht das Fehlerfinden nicht gerade einfacher.
Danke und Gruß
Ben
ZitatAllerdings musste ich die Prototypen aus den Funktionen entfernen, habe sonst immer "Too many arguments for ..." bekommen.
Das ist, pardon, auf mangelndes Verständnis von Perl zurückzuführen. Und für Software, die von mir stammt, aber dann modifiziert wurde, leiste ich keinerlei Support.
LG
pah
Hi,
nein, von Perl verstehe ich wirklich nicht viel. Habe mich auf den Beitrag von CoolTux bezogen: https://forum.fhem.de/index.php/topic,110316.msg1043883.html#msg1043883
Vielleicht liegt es auch an einer alten Perlversion, die ich einsetze. Das kann ich aber nur vermuten.
Wenn ich das Wiki richtig verstanden habe, sollte RoombaFegerClient auch ohne die 99_RoombaUtils.pm verbinden können - was sie auch mal tat, aber jetzt nicht mehr tut. Damit kann ich also deine Software oder Modifikationen als Fehlerquelle ausschließen. Habe ich das richtig verstanden?
LG Ben
Hi,
Ich bin auch kein Perl Experte, aber ich habe gelernt dass bei geänderten Übergabeparametern (in der letzten Version von pah wurden einige Übergabeparameter in einigen subs geändert) es einen restart braucht, um das korrekt einzulesen (siehe etwas weiter vorne im Forum). Also pahs letzte Version plus kompletter restart sollte das Problem beheben und Dich wieder auf eine unterstützte Version bringen.
Wobei bei einem "disconnected" Client alleine ein manuelles "connect" eine umfangreiche Meldung im Log bringen sollte...
Beste Grüße
Hermann
Hallo Hermann,
danke für den Hinweis, einen restart habe ich tatsächlich schon öfters gemacht.
Ich kann leider gar nicht nachvollziehen, woran es hängt. Habe inzwischen mehrmals den RoombaFegerClient gelöscht und neu hinzugefügt, ohne Erfolg. Es stellt sich kein connect ein. Ohne das brauche ich beim RoombaFeger natürlich nicht weitermachen. Ein Timeout wie in
https://forum.fhem.de/index.php/topic,114166.msg1126994.html#msg1126994
vorgeschlagen hilft auch nicht. Im Log findet sich außer den besagten NonBlocking Meldungen nichts - wobei die, wenn ich es richtig verstanden habe, keine Fehlermeldung sind.
Ich habe noch einen weiteren MQTT2 Client laufen, gehe aber nicht davon aus, dass es hier Wechselwirkungen gibt. Es lief ja schon mal.
Einen schönen Sonntagabend
Ben
Hallo Ben,
Hm, nach Deinen beiden Meldungen im Log sollte eigentlich ein "sending CONNECT" kommen. Hast Du mal die Attribute des clients überprüft?
Und sorry, nur zur Sicherheit: fhem update gemacht?
Beste Grüße
Hermann
Es ist ärgerlich, dass iRobot mit den letzten Firmware-Updates etwas eingebaut hat, dass die Kontaktaufnahme seitens FHEM verhindert. Ich habe auf beiden Kisten die Version 2.4.16-126.
Auf dem neueren 981er wurde das automatische Update im April durchgeführt ==> Nur ein Werksreset mit kompletter Neuanmeldung hat geholfen.
Auf dem älteren 960er kam das Update erst im Juni - seitdem ist er aus FHEM nicht mehr aufzuwecken. Muss wahrscheinlich auch den kompletten Reset machen.
Allerdings kriegt FHEM Kontakt zu ihm, wenn er über die App gestartet wurde. Aktuell suche ich immer noch nach einer dauerhafteren Lösung, ersaufe aber derzeit in Arbeit in meinem Brot-und-Butter-Job.
LG
pah
Hi,
auf meinem i7 läuft 3.14.16, aktualisiert am 4.6.21.
Seitdem fehlen cmTime und cmArea, aber Kontakt zwischen fhem und Robot klappt. Noch...
Beste Grüße
Hermann
Guten Abend,
auf meinem läuft dieselbe Software seit dem 4.6. Aber danach ging es ja definitiv.
Kann es sein, dass der Roboter sich eine bekannte und vertraute Verbindung merkt - und diese nach einem Löschen des RoombaFeger(Client) verloren gegangen ist?
Im Log steht tatsächlich noch nicht mal das "sending CONNECT". FHEM ist aktuell, wobei heute noch
UPD FHEM/lib/AttrTemplate/httpmod.template
reinkam. Wird wohl keinen Unterschied machen, aber ich update trotzdem mal :)
Einen Verbindungsaufbau nach Start über die Taste am 960 bzw. über die App bekomme ich auch nicht hin. Werde die Tage mal den Komplett-Reset versuchen.
pah, das ist wirklich frustrierend, wenn mit Firmware-Updates Interface-Änderungen reinkommen und die Arbeit nicht in Weiterentwicklung sondern Wartung fließt. Trotzdem bin ich dankbar für die vielen tausende Stunden Arbeit, die die Community hier reingesteckt hat. Es ist wirklich toll und es macht Spaß, zu tüfteln :)
Liebe Grüße!
OK, es hat funktioniert. Werksreset des 960er, komplettes Neu-Anlernen, Abfrage des neuen (!) Passworts - und er läuft wieder mit FHEM.
Habe das jetzt also bei beiden Kisten so gemacht, es handelt sich um ein reproduzierbares Ergebnis. Möglicherweise ein Effekt dieses FW-Update.
LG
pah
Hi,
habe auch gerade zurücksetzen können. Jetzt läuft es, komplett. Kann auch bestätigen, dass das Vorgehen nach Anleitung nun funktioniert (inkl. Leerzeichen ;-). Auf das Rücksetzen des Roboters wäre ich nie gekommen.
War ein wichtiger Hinweis, das neue Passwort abzufragen. Die GeräteID bleibt logischerweise die selbe.
Tatsächlich war es jetzt auch das erste Mal bei mir, dass die passwort.py ohne Fehler durchgelaufen ist. Beim letzten Mal hatte ich das Passwort nur über die roomba.py bekommen. Warum auch immer.
Vielen Dank für die Hilfe!!
Jetzt kann ich endlich wieder nachts staubsaugen (lassen). Nachdem die HUE App ihre Timer-Funktion beerdigt hat - und der Roomba natürlich Licht zum Saugen braucht, bleibt mir nur der Weg über FHEM.
Schöne Grüße!
Ben
So, mein dritter Roomba ist auf dem Weg. Ist dann ein i7 - so dass man erwarten kann, dass die Integration in die RoombaUtils besser wird.
LG
pah
Hier mal etwas zum Ausprobieren.
Weil ich es unergonomisch fand, die alten Maps mit einem FHEM-Befehl zu löschen, haben sie jetzt einen ordentlichen Button.
Ich habe da etwas mit dem Reading getrickst und würde gerne ein Feedback dazu haben.
LG
pah
Frage an die i7-Benutzer: Hat jemand schon eine Möglichkeit gefunden, die Räume und Zonen abzufragen, ohne erst ein Zeitprogramm zu definieren?
Irgendwie muss das gehen, die App jedenfalls kann das.
LG
pah
Hi,
Nein, ich zumindest nicht. Ich habe mal einen MITM Proxy zwischen app und Robot gehängt, aber auch nichts verwertbares gefunden. Hab aber nicht viel Zeit reingesteckt.
Wobei ich vermute, dass nur die App die Raum-Definitionen hat und IDs in die map schreibt, und mit der Cloud bzw dem Robot nur die map und die IDs in der map austauscht. Ist aber grobe Spekulation.
Beste Grüße
Hermann
So, ich habe mal wieder eine aktualisierte Version der RoombaUitils in den contrib-Ordner geladen. Das Teil läuft inzwischen astrein stabil mit meinen drei Robotern (einer davon ein i7).
Die von hapege beigesteuerten Routinen für den i7 sind im Wesentlichen (noch) unverändert. Eine Neuerung betrifft den Start: Sehr viel sicherer, weil erst abgewartet wird, bis der Roboter sich wirklich gemeldet hat. Eine weitere Neuerung sind Buttons zum Löschen alter Maps.
Das Wiki habe ich noch nicht angepasst, hier wären noch ein paar Absätze mit einer Anleitung zum Erstellen von Zonen etc. für die i7-Reihe sinnvoll, sowie mit den notwendigen Änderungen für die setList.
Als Nächstes werde ich mir die Einstellung von Zeitplänen vornehmen.
LG
pah
Ich habe gestern einen i7 geliefert bekommen und konnte ihn durch die tolle Wiki-Anleitung abends schon aus FHEM initial starten. Die App, die ich nur für die Einbindung ins WLAN benötigt habe, flog darauf hin gleich wieder vom Smartphone.
Heute Abend habe ich die "Komfortfunktionen" inkl. der RoombaUtils ergänzt und nun erste Linien in der (vorher leeren) SVG-Grafik gesehen.
Großen Dank an Prof. Henning und alle Unterstützer hier im Thread! Ich bin lange um so ein Gerät herum gelaufen und die Historie und das Engagement hier im Thread hat mich zum Kauf bewogen. Es hat sich alles so eingestellt, wie ich es nach der vorherigen Lektüre hier erwartet hatte. Danke!
Jetzt folgen die Feinheiten wie Zonen und FHEM-Aufträge zur Reinigung, damit der WAF gesteigert wird.
Gruß
Christian
ZitatDie App, die ich nur für die Einbindung ins WLAN benötigt habe, flog darauf hin gleich wieder vom Smartphone.
Fehler. Die braucht man nämlich zur Festlegung der Zonen und Räume.
Unten mal ein Screenshot eines aktuellen I7-Laufes von heute morgen. Rot=Startpunkt, Gelb bzw. Orange: Schwerpunkt der konvexen Hülle, die ebenfalls eingezeichnet ist. Die unterschiedlichen Positionen der Schwerpunke weisen auf unterschiedliche Kombinationen von Räumen bzw. Zonen hin.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 12 August 2021, 19:52:21
Fehler. Die braucht man nämlich zur Festlegung der Zonen und Räume.
Danke für den Hinweis. :) Ich habe jetzt die Karte mit Räumen und Zonen in der App. Im mittlerweile langen Thread habe ich den Beitrag #189 (https://forum.fhem.de/index.php/topic,114166.msg1129732.html#msg1129732 (https://forum.fhem.de/index.php/topic,114166.msg1129732.html#msg1129732)) gefunden von delMar mit einer Erweiterung dazu. Danach waren Räume kein Thema mehr. Ist das der Teil, der mittlerweile funktioniert und dessen Doku im Wiki noch zu ergänzen ist? Oder gab es noch Änderungen, die ich übersehen habe? Dann warte ich lieber geduldig auf die Wiki-Erweiterung.
Zitat von: Prof. Dr. Peter Henning am 12 August 2021, 19:52:21
Unten mal ein Screenshot eines aktuellen I7-Laufes von heute morgen. Rot=Startpunkt, Gelb bzw. Orange: Schwerpunkt der konvexen Hülle, die ebenfalls eingezeichnet ist. Die unterschiedlichen Positionen der Schwerpunke weisen auf unterschiedliche Kombinationen von Räumen bzw. Zonen hin.
Schick. Mir fehlt noch eine hübsche Basisgrafik des Raumes und ich muss noch ein wenig mit den Koordinaten und der View spielen, damit es so schick aussieht.
Gruß
Christian
ZitatDanach waren Räume kein Thema mehr. Ist das der Teil, der mittlerweile funktioniert und dessen Doku im Wiki noch zu ergänzen ist? Oder gab es noch Änderungen, die ich übersehen habe? Dann warte ich lieber geduldig auf die Wiki-Erweiterung.
1.Ja
2. Nein
Tja, das mit dem Warten dauert mit Sicherheit bis November... Derzeit überlastet und im Tilt-Modus.
LG
pah
Hi pah,
ich habe gerade wieder ein wenig Zeit gefunden mit dem Roomba zu "spielen".
Danke für Deine neue Version, der Löschen Button ist eine klasse Idee!
Ich habe ein paar Anmerkungen bzw vorsichtige Vorschläge:
Du verwendest nun "bbrArea" (hies bei mir mal "bbrunArea"), aber m.E. ist die Berechung nicht korrekt. Der Wert von sqft in bbrun ist der gereinigte "Gesamtbereich", der auch in der App angezeigt wird. Der Wert muss aber mit 100 multipliziert werden um ihn korrekt anzeigen zu können, also
$sqm = int($evtptr->{{'sqft'}*100/10.7639);
statt
$sqm = int($evtptr->{'sqft'}*10/10.7639)/10;
Die Versionsinfo des Moduls ist bei Dir
# $Id: RoombaUtils.pm 2020-09- pahenning $
Nach ein bisschen Stöbern glaube ich das ist nicht korrekt formatiert, sollte m.E. so aussehen:
# $Id: 99_RoombaUtils.pm 00001 2021-08-18 18:59:00Z pahenning $
und in der zweiten Codezeile stehen (zumindest machen das andere Module so...). Dann wirds bei "version 99" auch richtig angezeigt.
Beim Löschen von maps über den genialen Button wird die SVG nicht aktualisiert, erst nach dem nächsten Reinigungsvorgang. Ich habe das sehr brachial über eine sub "rewriteSVG", die ich in delmap aufrufe, "gelöst" bzw. hingebastelt (ist viel copy & paste code, nicht so schön).
Ich habe noch Funktionalität entworfen, um die verlorengegangene Zeit für einen Reinigungslauf auszugeben. Ist letztlich eine Substraktion "Endzeit - Startzeit".
Ich habe das alles - mit "hapege" comments - in Deine letzte Version eingebaut. Will ich hier so aber nicht posten, damits kein Versiondurcheinander gibt (Man lernt ja dazu ;) ). Soll ich Dir das irgendwie zukommen lassen, damit Du irgendwann übernehmen kannst was Du für geeignet hältst?
Beste Grüße,
Hermann
OK, Berechnung schaue ich mir an.
Das mit der Version sollte eigentlich beim Upload ins SVN-Repository automatisch gesetzt werden, kann sein, dass das beim contrib-Ordner abgestellt worden ist. Funktioniert bei den inzwischen 21 von mir betreuten Modulen im Hauptrepository jedenfalls gut.
LG
pah
Vermutlich ist die Id-Property nicht gesetzt?
Kann sein, liegt in einem anderen Verzeichnis als die anderen Module. Schau ich morgen mal nach. Allerdings wird das so beim Upload akzeptiert - was im Hauptverzeichnis von FHEM nicht der Fall ist.
LG
pah
2021.09.12 13:00:10 5: Roomba: discarding DISCONNECT (224)(0)
2021.09.12 13:00:10 5: HttpUtils url=https://192.168.1.42:8883/ NonBlocking via https
2021.09.12 13:00:10 4: IP: 192.168.1.42 -> 192.168.1.42
2021.09.12 13:00:15 5: Roomba: sending CONNECT (16)M(0)(4)MQTT(4)(194)(0)(30)(0)(15)(16)3XXXXXXXXXXXXX90(0)(16)3XXXXXXXXXXXXX90(0)(30):1:1XXXXXXXXXXXXXXXXXXXXXXXXuR
2021.09.12 13:00:15 5: DevIo_SimpleWrite Roomba: 104d00044d51545404c2001e000f333738343830433931393137363930001033313738343830433931393137363930001e3a313a313633313334383534363a39306431544d527452595a7a4f527552
2021.09.12 13:00:15 5: 192.168.1.42:8883 reappeared (Roomba)
2021.09.12 13:00:15 5: Roomba: received CONNACK (0)(5)
2021.09.12 13:00:15 1: Roomba: Connection refused, not authorized
2021.09.12 13:00:15 5: Roomba: discarding DISCONNECT (224)(0)
2021.09.12 13:00:15 5: 192.168.1.42:8883 disconnected, waiting to reappear (Roomba)
READINGS:
2021-09-12 13:00:15 state disconnected
sslargs:
SSL_version SSLv23
Attributes:
SSL 1
autocreate no
clientId 3XXXXXXXXXXXXX90
connectTimeout 6
disconnectAfter 5
mqttVersion 3.1.1
room Roomba
sslargs SSL_version:SSLv23
username 3XXXXXXXXXXXXX90
verbose 5
nano openssl.cnf
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=1
Ich bekomme es einfach nicht hin. Könnte jemand helfen?
Etwas Kontext würde helfen.
Hast du die Schritte aus dem Wiki befolgt?
Was hast du bisher gemacht?
Welches Modell hast du?
Evtl welche Firmware
Schöne Grüße
Martin
ZitatHast du die Schritte aus dem Wiki befolgt?
Was hast du bisher gemacht?
Welches Modell hast du?
Evtl welche Firmware
Ich wollte mich auf das wesentliche beschränken, wegen Deiner Nachfrage aber hier die ausführliche Beschreibung:
zu 1.) nach dem Wiki vorgegangen, was teilweise hilfreich war.
zu 2.) Das habe ich aber abgebrochen als ich mit den pip Befehlen gescheitert bin, weil ich das Wiki ab dort nicht mehr verstanden hatte. Daher habe ich diesen Beitrag über mehrere Abende durchgearbeitet, mit dem ich auch nicht weiter gekommen bin. Hiernach habe ich mich der Anleitung in der GitHub zugewendet. Der Roboter ließ sich damit zunächst nicht auf der cmd Ebene mit dem "Git-Skript .py" verbinden. In einem anderen Forum habe ich dann herausgefunden, dass das Einstellungen in der Datei openssl.cnf editiert werden müssen. Nach der Änderung (s. meinen Beitrag oben) habe ich es geschafft zunächst den Roomba auf der Linux Ebene zu verbunden. Daraufhin habe ich mich diesem Forumsbeitrag wieder zugewendet und nach weiteren Nachmittagen und späten Abendstunden, unzähligen Einstellungen und Versuchen (die ich hier nicht mehr im einzelnen wiedergeben kann), zeigte sich das Gerät weiterhin als disconnectet. Irgendwann bin ich dann irgendwie zu eine connect/disconnect Schleife gekommen, nachdem der das Gerät gar nicht mehr ansprechbar war. Gestern habe ich dann den iRoomba noch mal auf Werkeinstellungen gesetzt, was auch keine Abhilfe geschafft hatte. Ich habe dann den iRoombaClient in FHEM immer wieder neu eingerichtet mit dem gleichen Ergebnis. Nach weiteren Extrahieren aus diesem Forumsbeitrag, und Suche in Unterzweigen bin ich darauf gekommen, dass die .pm Datei gar nicht auf meinem Server liegt. Gestern Nachmittag hatte ich mich dann mit SVN Updates (und Installationsschwierigkeiten von svn auf der Linux Ebene) beschäftigt und es war wieder ein erfolgloser Abend vorbei. Heute habe ich das SVN Update geschafft und die erforderliche 99_.pm heruntergeladen und das gesamte SVN aktualisiert, was andere Fehler in FEHM (Gardena) erfreulicher Weise beseitigt hat. Seit heute morgen kam es dann zu dem hier im Forum schon öfter beschriebenen "SSL Zurückweisungen", die ich über das attr ConnectTimer behoben habe. Ich hatte zunächst angenommen, dass hierfür in den Einstellungen etwas grundlegend hinzugefügt werden müsste (wie weiter vorne in diesem Beitrag beschrieben) und bin dann über die Fehlersuche darauf gestoßen, dass es diese attr Einstellung im Modul inzwischen gibt. Die SSL Problematik wurde dadurch behoben jedoch kommt jetzt die o.g. neue Fehlermeldung.
Übrigens hatte ich für die Einbindung meines iRoomba 960 am letzten Wochenende mit der Firmware unter Home Assistent nur 1-2 Minuten benötigt. Um einer Nachfrage entgegenzuwirken: Ich habe es am letzten Wochenende nicht geschafft Steuerbefehle von FEHM in den iRoomba über Mosquitto via MQTT an Home Assistent zu senden, sonst hätte ich mir die Mühe gar nicht gemacht die Einbindung direkt unter FEHM zu probieren. Warum überhaupt Home Assistent? Weil es mit FEHM nicht direkt möglich ist meinen ICO im Garten zu verbunden und dann Daten in mein FHEM zu senden. In Home Assistent hat die Einrichtung nur wenige Sekunden gedauert. Irgendwann hoffe ich hiermit auch die Einbindung meiner Klimaanlage, die über FHEM ja nicht möglich ist (auch CoolTux hat die Sache irgendwann scheinbar nicht mehr weiter verfolgt). In Home Assistent gibt es dafür aber ein Modul in HACS ( Midea Smart Aircon ) was aber leider zur Zeit noch einen Bug hat.
zu 3.) Roomba960
zu 4.) Roboter-Software 2.4.16-126 (vom 11. Sept. 2021)
Vielen Dank!
Danke für die ausführliche Info.
An dieser Stelle muss leider gesagt werden, dass die Roomba-Anbindung in FHEM noch kein fertiges Modul ist, sondern eben noch in Entwicklung.
Deshalb auch die relativ umfangreiche Konfigurationsarbeit, was definitiv den Unterschied zu fertigen Modulen ausmacht (oder eben auch Home Assistant) und auch das manuelle Runterladen von 99_RoombaUtils.pm.
Nachdem das gesagt ist:
die Einrichtung per pip und python ist einer der wichtigsten Teile am ganzen Prozess, da du daraus die nötigen Infos kriegst, damit FHEM berechtigt ist, mit dem Roomba zu kommunizieren.
Bei copy/paste kommt es immer wieder vor, dass vor oder nach dem eigentlichen String ein Leerzeichen mitkommt, das nicht mitkommen soll.
Hast du schon mal probiert, das set RoombaFegerClient password :######################A nochmal auszuführen?
schöne Grüße
Martin
Das habe ich jetzt (noch ein weiteres mal) gemacht und es wird etwas neues ausgespuckt:
2021.09.14 19:06:47 5: 192.168.1.42:8883 reappeared (RoombaClient)
2021.09.14 19:06:47 5: RoombaClient: received CONNACK (0)(5)
2021.09.14 19:06:47 1: RoombaClient: Connection refused, not authorized
2021.09.14 19:06:47 5: RoombaClient: discarding DISCONNECT (224)(0)
2021.09.14 19:06:47 5: 192.168.1.42:8883 disconnected, waiting to reappear (RoombaClient)
Sollte ich die gesamte Einrichtung und Verbindung zum Robo (Reset) noch mal versuchen? Oder gibt es eine Möglichkeit herauszufinden, warum ich nicht autorisiert bin?
PS: Die Einrichtung der Klimaanlage über midea-ac-py (ein HACS Tool in der Hausautomatisierung Home Assistant) funktioniert jetzt sensationell gut! Hierüber können fast alle Klimaanlagen am Markt eingebunden werden! Wahrscheinlich werde ich mich jetzt damit beschäftigen wie ich aus FHEM -> Mosquitto -> MQTT -> Home Assistant Befehle an die dort eingebundenen Geräte schicken kann. Dann kann ich den Robo dort einfach wieder nach dem Reset anmelden und über FHEM bzw. TabletUI betreiben, bis es hier etwas ausgereifter ist.
Vielen Dank!
https://github.com/mac-zhou/midea-ac-py
Zitatbis es hier etwas ausgereifter ist
Pfff.
pah
Zitat von: SebastianStorb am 14 September 2021, 19:18:12
Sollte ich die gesamte Einrichtung und Verbindung zum Robo (Reset) noch mal versuchen? Oder gibt es eine Möglichkeit herauszufinden, warum ich nicht autorisiert bin?
Ich wüsste von keiner Möglichkeit, hier genauere Infos zu kriegen.
Zusätzliche Info wird eigentlich von den Entwicklern absichtlich nicht gegeben (zB Benutzer existiert nicht oder Passwort falsch), weil man diese Info ja ausnutzen könnte, um ein System zu hacken.
Ob du's nochmal versuchen sollst? Das kannst wohl nur du beantworten ;D
schöne Grüße
Martin
Zitat von: Prof. Dr. Peter Henning am 14 September 2021, 20:01:09
Pfff.
pah
Ich wollte Sie in keinem Fall verärgern und entschuldige mich, dass Sie meine Einschätzung als Abwertung empfunden haben. Für Spezialisten ist diese neue Tool bestimmt extrem hilfreich und endlich eine neue Lösung Roomba wieder einzubinden! Als Anfänger hatte vor dem Versuch der Installation gehofft, dass die Einrichtung so einfach werden wird, wie es mit dem Pferdekämpfer-Modul Roomba980 war (und ich bedauere, dass es bei mir nicht funktioniert).
Tipp:
1. Roomba komplett auf Werkseinstellungen zurücksetzen
2. Neu mit dem Python-Skript ansprechen, clientId und Passwort aufheben.
3. Im MQTT2_CLIENT die clientId, den usename (=clientId) und das Passwort setzen.
Dann wird das auch klappen.
LG
pah
Vielen Dank! Ich habe das Gerät jetzt mit FHEM Verbinden können - allerdings bekomme ich nur Informationen und kann das Gerät nicht steuern.
Zunächst hat folgender Teil im Wiki bei mir nicht funktioniert bzw. mit Fehlermeldung abgebrochen:
pip install git+https://github.com/NickWaterton/Roomba980-Python.git
Möglicher Weise ist die Anleitung hier nicht korrekt, ungenau oder funktioniert nicht bei jedem:
Möglich war es bei mir mit folgendem Befehl:
pip install git
git clone https://github.com/NickWaterton/Roomba980-Python.git
auf dem RPi:
pip install gitpython
Ab folgendem Punkt der Roomba-Wiki-Anleitung ist die weitere Umsetzung bei mir überhaupt nicht mehr möglich:
Einrichten eines MQTT Device
Wenn ich das Gerät den Vorschriften entsprechend für mein System anpasse bekomme ich keinerlei Informationen vom iRoomba. Erst als ich im MQTT2_CLIENT autocreate auf
complex gestellt habe, bekam ich ein neues Gerät erstellt, in dem ich die Daten des iRoomba gesendet bekomme. Wenn ich hier eine setlist erstelle funktioniert diese leider nicht bzw. fährt der Roboter nicht los - nur der State in FHEM steht entsprechend.
Weiterhin ist Roomba-Wiki für mich auf folgender Eintrag nicht verständlich bzw. nicht nachvollziebar. Ist das für den Start des Gerätes wichtig? Falls ja: Wo muss hier was wie erstellt werden:
Dazu muss natürlich in einem Package roomba die Funktion reading() definiert werden, die je nach einlaufenden Daten entsprechende Readings erzeugt.
Was ist das Package roomba und wo muss die Funktion reading() eingefügt werden. Für mich als Anfänger ist die Anleitung an dem Punkt leider nicht weiter umzusetzen.
zur Info:
Internals:
Clients :MQTT2_DEVICE:MQTT_GENERIC_BRIDGE:
ClientsKeepOrder 1
DEF 192.168.1.42:8883
DeviceName 192.168.1.42:8883
FUUID 613db31e-f33f-ec85-ed39-465a16350756c662
FVERSION 00_MQTT2_CLIENT.pm:0.249820/2021-09-16
NAME RoombaClient
NR 745
SSL 1
STATE disconnected
TIMEOUT 6
TYPE MQTT2_CLIENT
WBCallback
clientId 3XXXXXXXXXXXXXX0
devioLoglevel 5
disconnectAt 2021-09-27 18:21:31
lastMsgTime 1632759631.64682
nextOpenDelay 5
MatchList:
1:MQTT2_DEVICE ^.
2:MQTT_GENERIC_BRIDGE ^.
READINGS:
2021-09-26 14:05:12 lastPublish start:
2021-09-27 18:22:22 state disconnected
sslargs:
SSL_version SSLv23
Attributes:
SSL 1
autocreate complex
clientId 3XXXXXXXXXXXXXX0
connectTimeout 6
disconnectAfter 60
mqttVersion 3.1.1
room Roomba
sslargs SSL_version:SSLv23
username 3XXXXXXXXXXXXXX0
und:
Internals:
CID 3XXXXXXXXXXXXXX0
DEF 3XXXXXXXXXXXXXX0
DEVICETOPIC RoombaHome
FUUID 61505c7c-f33f-ec85-de85-09fcb7f8b648bc6d
FVERSION 10_MQTT2_DEVICE.pm:0.248610/2021-08-20
IODev RoombaClient
LASTInputDev RoombaClient
MSGCNT 45
NAME RoombaHome
NR 751
RoombaClient_MSGCNT 45
RoombaClient_TIME 2021-09-27 18:20:31
STATE start
TYPE MQTT2_DEVICE
READINGS:
2021-09-27 18:18:40 IODev RoombaClient
2021-09-27 18:20:12 UNDEFINED_state_reported_localtimeoffset 120
2021-09-27 18:20:12 UNDEFINED_state_reported_mac d0:c5:d3:ce:49:87
2021-09-27 18:20:12 UNDEFINED_state_reported_netinfo_addr 3232235818
2021-09-27 18:20:12 UNDEFINED_state_reported_netinfo_bssid 44:4e:6d:84:18:3b
2021-09-27 18:20:12 UNDEFINED_state_reported_netinfo_dhcp true
2021-09-27 18:20:12 UNDEFINED_state_reported_netinfo_dns1 3232235777
2021-09-27 18:20:12 UNDEFINED_state_reported_netinfo_dns2 0
2021-09-27 18:20:12 UNDEFINED_state_reported_netinfo_gw 3232235777
2021-09-27 18:20:12 UNDEFINED_state_reported_netinfo_mask 4294967040
2021-09-27 18:20:12 UNDEFINED_state_reported_netinfo_sec 4
2021-09-27 18:20:12 UNDEFINED_state_reported_pose_point_x 167
2021-09-27 18:20:12 UNDEFINED_state_reported_pose_point_y -34
2021-09-27 18:20:12 UNDEFINED_state_reported_pose_theta -173
2021-09-27 18:20:31 UNDEFINED_state_reported_signal_rssi -67
2021-09-27 18:20:31 UNDEFINED_state_reported_signal_snr 22
2021-09-27 18:20:12 UNDEFINED_state_reported_utctime 1632759620
2021-09-27 18:20:12 UNDEFINED_state_reported_wifistat_cloud 1
2021-09-27 18:20:12 UNDEFINED_state_reported_wifistat_uap false
2021-09-27 18:20:12 UNDEFINED_state_reported_wifistat_wifi 1
2021-09-27 18:20:12 UNDEFINED_state_reported_wlcfg_sec 7
2021-09-27 18:20:12 UNDEFINED_state_reported_wlcfg_ssid 404040
2021-09-27 18:20:07 state start
2021-09-27 18:20:12 update_state_reported_batPct 100
2021-09-27 18:20:12 update_state_reported_batteryType li26
2021-09-27 18:20:12 update_state_reported_bbchg3_avgMin 294
2021-09-27 18:20:12 update_state_reported_bbchg3_estCap 7451
2021-09-27 18:20:12 update_state_reported_bbchg3_hOnDock 14802
2021-09-27 18:20:12 update_state_reported_bbchg3_nAvail 6410
2021-09-27 18:20:12 update_state_reported_bbchg3_nDocks 230
2021-09-27 18:20:12 update_state_reported_bbchg3_nLithChrg 592
2021-09-27 18:20:12 update_state_reported_bbchg3_nNimhChrg 0
2021-09-27 18:20:12 update_state_reported_bbchg_aborts_1 4
2021-09-27 18:20:12 update_state_reported_bbchg_aborts_2 4
2021-09-27 18:20:12 update_state_reported_bbchg_aborts_3 4
2021-09-27 18:20:12 update_state_reported_bbchg_nChgOk 589
2021-09-27 18:20:12 update_state_reported_bbchg_nLithF 0
2021-09-27 18:20:12 update_state_reported_bbmssn_aCycleM 21
2021-09-27 18:20:12 update_state_reported_bbmssn_aMssnM 16
2021-09-27 18:20:12 update_state_reported_bbmssn_nMssn 727
2021-09-27 18:20:12 update_state_reported_bbmssn_nMssnC 238
2021-09-27 18:20:12 update_state_reported_bbmssn_nMssnF 68
2021-09-27 18:20:12 update_state_reported_bbmssn_nMssnOk 421
2021-09-27 18:20:12 update_state_reported_bbnav_aExpo 7
2021-09-27 18:20:12 update_state_reported_bbnav_aGain 9
2021-09-27 18:20:12 update_state_reported_bbnav_aMtrack 63
2021-09-27 18:20:12 update_state_reported_bbnav_nGoodLmrks 11
2021-09-27 18:20:12 update_state_reported_bbpanic_panics_1 8
2021-09-27 18:20:12 update_state_reported_bbpanic_panics_2 8
2021-09-27 18:20:12 update_state_reported_bbpanic_panics_3 8
2021-09-27 18:20:12 update_state_reported_bbpanic_panics_4 8
2021-09-27 18:20:12 update_state_reported_bbpanic_panics_5 8
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_1 3
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_10 0
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_2 0
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_3 0
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_4 0
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_5 4
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_6 18
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_7 6
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_8 3
2021-09-27 18:20:12 update_state_reported_bbpause_pauses_9 4
2021-09-27 18:20:12 update_state_reported_bbrstinfo_causes 0009
2021-09-27 18:20:12 update_state_reported_bbrstinfo_nMobRst 9
2021-09-27 18:20:12 update_state_reported_bbrstinfo_nNavRst 90
2021-09-27 18:20:13 update_state_reported_bbrun_hr 324
2021-09-27 18:20:13 update_state_reported_bbrun_min 32
2021-09-27 18:20:13 update_state_reported_bbrun_nCBump 0
2021-09-27 18:20:13 update_state_reported_bbrun_nCliffsF 11604
2021-09-27 18:20:13 update_state_reported_bbrun_nCliffsR 9557
2021-09-27 18:20:13 update_state_reported_bbrun_nMBStll 9
2021-09-27 18:20:13 update_state_reported_bbrun_nPanics 706
2021-09-27 18:20:13 update_state_reported_bbrun_nPicks 1330
2021-09-27 18:20:13 update_state_reported_bbrun_nScrubs 379
2021-09-27 18:20:13 update_state_reported_bbrun_nStuck 191
2021-09-27 18:20:13 update_state_reported_bbrun_nWStll 5
2021-09-27 18:20:13 update_state_reported_bbrun_sqft 1346
2021-09-27 18:20:12 update_state_reported_bbswitch_nBumper 44074
2021-09-27 18:20:12 update_state_reported_bbswitch_nClean 571
2021-09-27 18:20:12 update_state_reported_bbswitch_nDock 230
2021-09-27 18:20:12 update_state_reported_bbswitch_nDrops 1035
2021-09-27 18:20:12 update_state_reported_bbswitch_nSpot 62
2021-09-27 18:20:13 update_state_reported_bbsys_hr 15809
2021-09-27 18:20:13 update_state_reported_bbsys_min 42
2021-09-27 18:20:12 update_state_reported_binPause false
2021-09-27 18:20:12 update_state_reported_bin_full false
2021-09-27 18:20:12 update_state_reported_bin_present true
2021-09-27 18:20:12 update_state_reported_bootloaderVer 4042
2021-09-27 18:20:12 update_state_reported_cap_binFullDetect 1
2021-09-27 18:20:12 update_state_reported_cap_eco 1
2021-09-27 18:20:12 update_state_reported_cap_edge 1
2021-09-27 18:20:12 update_state_reported_cap_langOta 1
2021-09-27 18:20:12 update_state_reported_cap_maps 1
2021-09-27 18:20:12 update_state_reported_cap_multiPass 2
2021-09-27 18:20:12 update_state_reported_cap_ota 2
2021-09-27 18:20:12 update_state_reported_cap_pose 1
2021-09-27 18:20:12 update_state_reported_cap_pp 1
2021-09-27 18:20:12 update_state_reported_cap_svcConf 1
2021-09-27 18:20:12 update_state_reported_carpetBoost true
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_cycle none
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_error 0
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_expireM 0
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_expireTm 0
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_initiator localApp
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_mssnM 0
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_mssnStrtTm 0
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_nMssn 727
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_notReady 0
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_phase charge
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_rechrgM 0
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_rechrgTm 0
2021-09-27 18:20:12 update_state_reported_cleanMissionStatus_sqft 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_cycle_1 none
2021-09-27 18:20:12 update_state_reported_cleanSchedule_cycle_2 none
2021-09-27 18:20:12 update_state_reported_cleanSchedule_cycle_3 none
2021-09-27 18:20:12 update_state_reported_cleanSchedule_cycle_4 none
2021-09-27 18:20:12 update_state_reported_cleanSchedule_cycle_5 none
2021-09-27 18:20:12 update_state_reported_cleanSchedule_cycle_6 none
2021-09-27 18:20:12 update_state_reported_cleanSchedule_cycle_7 none
2021-09-27 18:20:12 update_state_reported_cleanSchedule_h_1 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_h_2 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_h_3 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_h_4 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_h_5 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_h_6 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_h_7 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_m_1 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_m_2 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_m_3 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_m_4 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_m_5 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_m_6 0
2021-09-27 18:20:12 update_state_reported_cleanSchedule_m_7 0
2021-09-27 18:20:12 update_state_reported_cloudEnv prod
2021-09-27 18:20:12 update_state_reported_country DE
2021-09-27 18:20:12 update_state_reported_dock_known false
2021-09-27 18:20:12 update_state_reported_ecoCharge false
2021-09-27 18:20:12 update_state_reported_hardwareRev 3
2021-09-27 18:20:12 update_state_reported_langs_1_en-UK 0
2021-09-27 18:20:12 update_state_reported_langs_2_fr-FR 1
2021-09-27 18:20:12 update_state_reported_langs_3_es-ES 2
2021-09-27 18:20:12 update_state_reported_langs_4_it-IT 3
2021-09-27 18:20:12 update_state_reported_langs_5_de-DE 4
2021-09-27 18:20:12 update_state_reported_langs_6_ru-RU 5
2021-09-27 18:20:12 update_state_reported_language 0
2021-09-27 18:20:12 update_state_reported_lastCommand_command pause
2021-09-27 18:20:12 update_state_reported_lastCommand_initiator localApp
2021-09-27 18:20:12 update_state_reported_lastCommand_time 1
2021-09-27 18:20:12 update_state_reported_mapUploadAllowed true
2021-09-27 18:20:12 update_state_reported_mobilityVer 5938
2021-09-27 18:20:12 update_state_reported_name Home
2021-09-27 18:20:12 update_state_reported_navSwVer 01.12.01#1
2021-09-27 18:20:12 update_state_reported_noAutoPasses false
2021-09-27 18:20:12 update_state_reported_noPP false
2021-09-27 18:20:12 update_state_reported_openOnly false
2021-09-27 18:20:12 update_state_reported_schedHold false
2021-09-27 18:20:12 update_state_reported_sku R960040
2021-09-27 18:20:12 update_state_reported_softwareVer v2.4.16-126
2021-09-27 18:20:12 update_state_reported_soundVer 32
2021-09-27 18:20:12 update_state_reported_svcEndpoints_svcDeplId v011
2021-09-27 18:20:12 update_state_reported_timezone Europe/Berlin
2021-09-27 18:20:12 update_state_reported_twoPass false
2021-09-27 18:20:12 update_state_reported_tz_events_1_dt 1625140800
2021-09-27 18:20:12 update_state_reported_tz_events_1_off 120
2021-09-27 18:20:12 update_state_reported_tz_events_2_dt 1635642001
2021-09-27 18:20:12 update_state_reported_tz_events_2_off 60
2021-09-27 18:20:12 update_state_reported_tz_events_3_dt 1648342801
2021-09-27 18:20:12 update_state_reported_tz_events_3_off 120
2021-09-27 18:20:12 update_state_reported_tz_ver 11
2021-09-27 18:20:12 update_state_reported_uiSwVer 4582
2021-09-27 18:20:12 update_state_reported_umiVer 6
2021-09-27 18:20:12 update_state_reported_vacHigh false
2021-09-27 18:20:12 update_state_reported_wifiAnt 1
2021-09-27 18:20:12 update_state_reported_wifiSwVer 21045
Attributes:
readingList 3XXXXXXXXXXXXXX0:wifistat:.* { json2nameValue($EVENT, 'UNDEFINED_', $JSONMAP) }
3XXXXXXXXXXXXXX0:\x24aws/things/3XXXXXXXXXXXXXX0/shadow/update:.* { json2nameValue($EVENT, 'update_', $JSONMAP) }
$DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
room Roomba
setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"} \
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"} \
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
Nochmals vielen Dank für die Unterstützung!
1. Bitte Anfängerdoku lesen.
2. Modul 99_RoombaUtils.pm installieren.
3. Wiki befolgen: attr <device> readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
LG
pah
Hallo,
nach einigem Lesen (nicht nur hier), habe ich es hin bekommen die "Zugangsdaten" aus meinem neuen Roomba J7 auszulesen. (mit der sauteuren iOS-App "Thor HTTP(S) Sniffer") und die beiden MQTTs (Client und Device) anzulegen. Funktioniert soweit. Muss mich nur bissi mehr in den Mechanismus mit dem "SetList" für die Kommandos rein fuchsen...
Allerdings habe ich eine seltsame Auffälligkeit (so wie das Modul "aus der Schachtel purzelt", ohne Veränderungen): Ich sehe zwar gefühlt eine Fantastilliarde Readings, aber nix was den Batterie-/Ladestand preisgibt. Oder ich sehe die Information vor lauter Readings nicht?
Liebe Grüße
Mike
Zitat von: MikeR am 05 Oktober 2021, 12:54:31
Hallo,
nach einigem Lesen (nicht nur hier), habe ich es hin bekommen die "Zugangsdaten" aus meinem neuen Roomba J7 auszulesen. (mit der sauteuren iOS-App "Thor HTTP(S) Sniffer") und die beiden MQTTs (Client und Device) anzulegen. Funktioniert soweit. Muss mich nur bissi mehr in den Mechanismus mit dem "SetList" für die Kommandos rein fuchsen...
Allerdings habe ich eine seltsame Auffälligkeit (so wie das Modul "aus der Schachtel purzelt", ohne Veränderungen): Ich sehe zwar gefühlt eine Fantastilliarde Readings, aber nix was den Batterie-/Ladestand preisgibt. Oder ich sehe die Information vor lauter Readings nicht?
Liebe Grüße
Mike
OK, weil ich leicht schizo bin, antworte ich mir mal selbst...
Ich hab nun die "99_RoombaUtils.pm" aus Post #317 genommen, und damit habe ich die Anzahl der Readings auf 3 Fantastilliarden erhöht. Hier ist nun auch ein "state_reported_batPct" dabei. Perfekt!
Bin noch nicht so 100%ig zufrieden...
Am Anfang, nach beachten des Anfänger-WIKIs zum Thema, konnte ich meinen Roomba starten, pausieren und ins Dock fahren.
Jetzt nach dem hin und her Kopieren der "99_RoombaUtils.pm" funktionieren die "set"-Befehle nicht mehr. Connectet ist er, sieht man an den regelmäßigen Aktualisierungen der WLAN-Feldstärken (RSSI, SNR,...). Auch das herstellen der Original "99_RoombaUtils.pm" bringt keine Verbesserung. Was ich seitdem gemacht haben ist ein SetList weiter unten aus dem WIKI:
attr Roomba setList start:noArg {roomba::command($NAME,"start",$EVENT)} \
stop:noArg {roomba::command($NAME,"stop",$EVENT)} \
dock:noArg {roomba::command($NAME,"dock",$EVENT)} \
resume:noArg {roomba::command($NAME,"resume",$EVENT)} \
pause:noArg {roomba::command($NAME,"pause",$EVENT)} \
CarpetBoost:true,false {roomba::setting($NAME,"carpetBoost",$EVENT)} \
TwoPass:true,false {roomba::setting($NAME,"twoPass",$EVENT)} \
NoAutoPasses:true,false {roomba::setting($NAME,"noAutoPasses",$EVENT)} \
NoPP:true,false {roomba::setting($NAME,"noPP",$EVENT)} \
VacHigh:true,false {roomba::setting($NAME,"vacHigh",$EVENT)} \
BinPause:true,false {roomba::setting($NAME,"binPause",$EVENT)} \
OpenOnly:true,false {roomba::setting($NAME,"openOnly",$EVENT)} \
maplist:noArg {roomba::setting($NAME,"local:cmMapList={listmaps('$NAME')}",$EVENT)} \
mapdel {roomba::setting($NAME,"local:cmMapList={delmap('$NAME','$EVENT')}",$EVENT)}
habe aber auch das mit diesem setList ganz oben aus dem WIKI wieder rückgängig gemacht (hoffe ich):
attr Roomba setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"} \
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"} \
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
Im Log steht:
2021.10.05 14:20:16 3: MQTT2_DEVICE set Roomba start
2021.10.05 14:20:16 1: ERROR evaluating my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $NAME= $evalSpecials->{'%NAME'};{roomba::command($NAME,"start",$EVENT)}: Undefined subroutine &roomba::command called at (eval 372) line 1.
Jetzt stehe ich doch wieder da und bräuchte mal Hilfe... :(
Steht doch im Log. Das Package "roomba", also der Inhalt der Datei 99_RoombaUtils.pm, ist nicht bekannt.
Merke: "Hin- und herkopieren" führt in die Irre, wenn man sich nicht an die Anleitung hält.
LG
pah
Also eigentlich habe ich es da gelassen, wo ich es auch gefunden hatte:
drwxr-xr-x 2 fhem dial out 4096 Okt 5 14:17 .
drwxr-xr-x 52 fhem dial out 12288 Okt 4 12:14
-rw-r--r-- 1 fhem dial out 56937 Okt 5 14:17 99_RoombaUtils.pm
pi@raspberry:/opt/fhem/contrib/Roomba $
Also unter: /opt/fhem/contrib/Roomba
OK, an "Wer lesen kann ist klar im Vorteil" ist wohl doch was dran!
Hab die "99_RoombaUtils.pm" jetzt wie in der Anleitung beschrieben nach fhem/FHEM kopiert und es geht. Selztsam ist nur, das ich da gar nicht drin rum geleuchtet hatte und es am Anfang trotzdem mal funktioniert hat...
Ich bin nun an der Map-Integration dran...
...aber anscheinend bin ich wirklich zu blöde um eine einfach Anleitung zu befolgen?
Ich habe den Abschnitt "Reinigungskarten" meiner Meinung nach Step-by-Step komplett durchgearbeitet. Und weil da steht, dass der Bereich noch in Arbeit ist, habe ich die aktuelle (?) Version der "99_RoombaUtils.pm" aus dem SVN genommen.
Meine Attribute sehen aus, wie im Anhang, hier als Text:
Attributes:
IODev RoombaClient
SVG_collect SVG_Roomba.xml
SVG_color1 green:lightgreen
SVG_color2 orange:yellow
SVG_color3 red:pink
SVG_color4 blue:lightblue
SVG_final SVG_Roomba.svg
SVG_room floorplan.svg
devicetopic 33C5CFE4551D4DCBA5F8BB89519869EA
noMap false
readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
room _Haushaltsgeräte
setList start:noArg {roomba::command($NAME,"start",$EVENT)}
stop:noArg {roomba::command($NAME,"stop",$EVENT)}
dock:noArg {roomba::command($NAME,"dock",$EVENT)}
resume:noArg {roomba::command($NAME,"resume",$EVENT)}
pause:noArg {roomba::command($NAME,"pause",$EVENT)}
CarpetBoost:true,false {roomba::setting($NAME,"carpetBoost",$EVENT)}
TwoPass:true,false {roomba::setting($NAME,"twoPass",$EVENT)}
NoAutoPasses:true,false {roomba::setting($NAME,"noAutoPasses",$EVENT)}
NoPP:true,false {roomba::setting($NAME,"noPP",$EVENT)}
BinPause:true,false {roomba::setting($NAME,"binPause",$EVENT)}
OpenOnly:true,false {roomba::setting($NAME,"openOnly",$EVENT)}
maplist:noArg {roomba::setting($NAME,"local:cmMapList={listmaps('$NAME')}",$EVENT)}
mapdel {roomba::setting($NAME,"local:cmMapList={delmap('$NAME','$EVENT')}",$EVENT)}
startdir north
startx 0
starty 0
stateFormat state_reported_batPct% (Batterieladung)
userattr startdir:north,west,south,east startx starty LOG_dir SVG_dir SVG_room SVG_collect SVG_final SVG_color1 SVG_color2 SVG_color3 SVG_color4 noMap:true,false
Für die Template-SVG habe ich aus dem Wiki als ersten Versuch die erste leere Variante genommen:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="800" viewBox="-30 -30 1200 800">
</svg>
Start- und Endpunkt erstmal auf 0, Ausrichtung Norden
Mit set Roomba maplist
bekomme ich aber kein Reading maplist. Egal ob ich es vor oder nach einem Reinigungslauf absetze.
Ebenso wird auch keine XML-Datei mit dem angegebenen Namen erzeugt. (wo müsste die den sein? Habe rekursiv die ganze /opt/fhem-Struktur durchsucht)
Im Log (Verbose=5) steht auch nichts Auffälliges in Richtung Map-Generierung
Und was mir zusätzlich fehlt: Wie mache ich denn eine erstellte Karte im FHEM sichtbar?
LG
Mike
Vielleicht eine Sache noch:
autocreate ist bei mir disabled, weil ich sonst hunderte von KNX-Objekten bekomme.
Hoffe damit hat es nix zu tun!
Bitte das hier befolgen.
Zitat
<li><code><b>noMap</b> true|false</code> - if set to true, no map data will be collected</li>
<li><code><b>LOG_dir</b> <directory name> </code> - directory for writing a log file (in perl format!) of each cleaning mission.
If this attribute is omitted, no such file will be written</li>
<li><code><b>SVG_dir</b> <directory name> </code> - directory for reading a graphical room map in SVG format and reading/writing intermediate XML files of each cleaning mission.
If this attribute is omitted, the default <code>/opt/fhem/www/images</code> will be used</li>. Note: In order to display the files via FHEMWEB frontend, they must reside in the working space of the web server.
<li><code><b>SVG_room</b> <file name> </code> - filename for reading a graphical room map in SVG format.
If this attribute is missing, no such file will be written</li>
<li><code><b>SVG_collect</b> <file name> </code> - filename for reading/writing intermediate XML file of each cleaning mission.
If this attribute is missing, the default <code>SVG_<device>.xml</code> will be used</li>
<li><code><b>SVG_final</b> <file name> </code> - filename for writing final SVG file of each cleaning mission.
If this attribute is missing, the default <code>SVG_<device>.svg</code> will be used</li>
ZitatSelztsam ist nur, das ich da gar nicht drin rum geleuchtet hatte und es am Anfang trotzdem mal funktioniert hat...
Endlich, die Magie ist entdeckt! Programme funktionieren, ohne dass sie geladen und gestartet werden...
LG pah
Zitat von: Prof. Dr. Peter Henning am 06 Oktober 2021, 18:24:10
Bitte das hier befolgen.
Endlich, die Magie ist entdeckt! Programme funktionieren, ohne dass sie geladen und gestartet werden...
Also, ich bin Dipl.-Inform. und seit über 40 Jahren "im Geschäft", und hab schon so ziemlich alles erlebt. Von Reinigungskräften die den Schukostecker so in die Steckdose stecken, das es nur so aussieht als wäre er drinne, über Seiteneffekte, die Sicherheitseinstellungen außer kraft setzen, bis hin zu Programmen die laufen obwohl sie gar nicht da sind (z.B. Netzwerkpfade im User-Path-Env) und und und
Ich komme mit der Anleitung nicht klar, weil diese bereits im 2 FHEM System nicht funktionieren und zu Fehlermeldungen führen.
Als Benutzer lässt sich bei meinen Systemen die Anleitung in keine Weise umsetzen. Was funktioniert hat, damit die Installation überhaupt funktioniert ist:
zu su - mit Passwort wechseln dann:
pip3 install paho-mqtt (klappt nicht (ohne su /pip3)
pip3 install aiohttp (klappt nicht (ohne su /pip3)
pip3install pillow (klappt nicht (ohne su /pip3)
pip3 install six
In welches Verzeichnis muss dorita980 kopiert werden? Oder ist das nicht wichtig?
git clone https://github.com/koalazak/dorita980.git
cd dorita980
npm install
npm audit fix --force
Passwort bekomme ich und Verbindung steht - leider auch der Roboter - keine Reaktion auf nichts!
2021.10.12 15:24:16 3: MQTT2_DEVICE set RoombaFeger start
2021.10.12 15:24:16 5: HttpUtils url=https://192.168.0.32:8883/ NonBlocking via https
2021.10.12 15:24:16 4: IP: 192.168.0.32 -> 192.168.0.32
2021.10.12 15:24:20 5: RoombaFegerClient: sending CONNECT (16)N(0)(4)MQTT(4)(194)(0)(30)(0)(16)3192C22060734880(0)(16)3192C22060734880(0)(30)XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2021.10.12 15:24:20 5: DevIo_SimpleWrite RoombaFegerClient: 104e00044d51545404c2001e001033313932433232303630373334383830001033313932433232303630373334383830001e3a313a313536363330383331323a6b454744577250536d4148534b326e74
2021.10.12 15:24:20 5: 192.168.0.32:8883 reappeared (RoombaFegerClient)
2021.10.12 15:24:20 5: RoombaFegerClient: received CONNACK (0)(0)
2021.10.12 15:24:20 5: RoombaFegerClient: sending SUBSCRIBE (130)(6)(0)(12)(0)(1)#(0)
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"netinfo":{"dhcp":true,"addr":3232235552,"mask":4294967040,"gw":3232235521,"dns1":3232235521,"dns2":0,"bssid":"3c:a6:2f:1e:9e:c4","sec":4}}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"netinfo":{"dhcp":true,"addr":3232235552,"mask":4294967040,"gw":3232235521,"dns1":3232235521,"dns2":0,"bssid":"3c:a6:2f:1e:9e:c4","sec":4}}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"wifistat":{"wifi":1,"uap":false,"cloud":1}}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"wifistat":{"wifi":1,"uap":false,"cloud":1}}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"netinfo":{"dhcp":true,"addr":3232235552,"mask":4294967040,"gw":3232235521,"dns1":3232235521,"dns2":0,"bssid":"3c:a6:2f:1e:9e:c4","sec":4}}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"netinfo":{"dhcp":true,"addr":3232235552,"mask":4294967040,"gw":3232235521,"dns1":3232235521,"dns2":0,"bssid":"3c:a6:2f:1e:9e:c4","sec":4}}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"wlcfg":{"sec":7,"ssid":"404040"}}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"wlcfg":{"sec":7,"ssid":"404040"}}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received SUBACK (0)(12)(0)
2021.10.12 15:24:20 5: RoombaFegerClient: sending PUBLISH 0?(0)(3)cmd{"command": "start", "time": 1, "initiator": "localApp"} \
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"mac":"dc:f5:05:90:83:0b"}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"mac":"dc:f5:05:90:83:0b"}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"country": "DE"}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"country": "DE"}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"cloudEnv": "prod"}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"cloudEnv": "prod"}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"svcEndpoints":{"svcDeplId": "v007"}}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"svcEndpoints":{"svcDeplId": "v007"}}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"wifiAnt":1}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"wifiAnt":1}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"mapUploadAllowed":true}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"mapUploadAllowed":true}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"signal":{"rssi":-47,"snr":42}}}}
2021.10.12 15:24:20 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"signal":{"rssi":-47,"snr":42}}}}
2021.10.12 15:24:20 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:20 5: 192.168.0.32:8883 disconnected, waiting to reappear (RoombaFegerClient)
2021.10.12 15:24:22 5: HttpUtils url=https://192.168.0.32:8883/ NonBlocking via https
2021.10.12 15:24:22 4: IP: 192.168.0.32 -> 192.168.0.32
2021.10.12 15:24:26 5: RoombaFegerClient: sending CONNECT (16)N(0)(4)MQTT(4)(194)(0)(30)(0)(16)3192C22060734880(0)(16)3192C22060734880(0)(30)XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2021.10.12 15:24:26 5: DevIo_SimpleWrite RoombaFegerClient: 104e00044d51545404c2001e001033313932433232303630373334383830001033313932433232303630373334383830001e3a313a313536363330383331323a6b454744577250536d4148534b326e74
2021.10.12 15:24:26 5: 192.168.0.32:8883 reappeared (RoombaFegerClient)
2021.10.12 15:24:26 5: RoombaFegerClient: received CONNACK (0)(0)
2021.10.12 15:24:26 5: RoombaFegerClient: sending SUBSCRIBE (130)(6)(0)(11)(0)(1)#(0)
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"netinfo":{"dhcp":true,"addr":3232235552,"mask":4294967040,"gw":3232235521,"dns1":3232235521,"dns2":0,"bssid":"3c:a6:2f:1e:9e:c4","sec":4}}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"netinfo":{"dhcp":true,"addr":3232235552,"mask":4294967040,"gw":3232235521,"dns1":3232235521,"dns2":0,"bssid":"3c:a6:2f:1e:9e:c4","sec":4}}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"wifistat":{"wifi":1,"uap":false,"cloud":1}}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"wifistat":{"wifi":1,"uap":false,"cloud":1}}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"netinfo":{"dhcp":true,"addr":3232235552,"mask":4294967040,"gw":3232235521,"dns1":3232235521,"dns2":0,"bssid":"3c:a6:2f:1e:9e:c4","sec":4}}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"netinfo":{"dhcp":true,"addr":3232235552,"mask":4294967040,"gw":3232235521,"dns1":3232235521,"dns2":0,"bssid":"3c:a6:2f:1e:9e:c4","sec":4}}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received SUBACK (0)(11)(0)
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"wlcfg":{"sec":7,"ssid":"404040"}}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"wlcfg":{"sec":7,"ssid":"404040"}}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"mac":"dc:f5:05:90:83:0b"}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"mac":"dc:f5:05:90:83:0b"}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"country": "DE"}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"country": "DE"}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"cloudEnv": "prod"}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"cloudEnv": "prod"}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"svcEndpoints":{"svcDeplId": "v007"}}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"svcEndpoints":{"svcDeplId": "v007"}}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"wifiAnt":1}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"wifiAnt":1}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"mapUploadAllowed":true}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"mapUploadAllowed":true}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:26 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"localtimeoffset":120,"utctime":1634045065,"pose":{"theta":99,"point":{"x":34,"y":-15}}}}}
2021.10.12 15:24:26 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"localtimeoffset":120,"utctime":1634045065,"pose":{"theta":99,"point":{"x":34,"y":-15}}}}}
2021.10.12 15:24:26 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:27 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"batPct":100,"dock":{"known":true},"bin":{"present":true,"full":false},"cleanMissionStatus":{"cycle":"none","phase":"charge","expireM":0,"rechrgM":0,"error":0,"notReady":0,"mssnM":0,"mssnStrtTm":0,"expireTm":0,"rechrgTm":0,"sqft":0,"initiator":"localApp","nMssn":156},"language":4,"noAutoPasses":true,"noPP":false,"ecoCharge":false,"vacHigh":false,"binPause":true,"carpetBoost":true,"openOnly":false,"twoPass":true,"schedHold":false}}}
2021.10.12 15:24:27 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"batPct":100,"dock":{"known":true},"bin":{"present":true,"full":false},"cleanMissionStatus":{"cycle":"none","phase":"charge","expireM":0,"rechrgM":0,"error":0,"notReady":0,"mssnM":0,"mssnStrtTm":0,"expireTm":0,"rechrgTm":0,"sqft":0,"initiator":"localApp","nMssn":156},"language":4,"noAutoPasses":true,"noPP":false,"ecoCharge":false,"vacHigh":false,"binPause":true,"carpetBoost":true,"openOnly":false,"twoPass":true,"schedHold":false}}}
2021.10.12 15:24:27 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:27 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"lastCommand":{"command":"dock","time":1634044399,"initiator":"localApp"},"langs":[{"en-UK":0},{"fr-FR":1},{"es-ES":2},{"it-IT":3},{"de-DE":4},{"ru-RU":5}],"bbnav":{"aMtrack":13,"nGoodLmrks":21,"aGain":12,"aExpo":18},"bbpanic":{"panics":[1,8,8,8,8]},"bbpause":{"pauses":[2,2,17,17,0,6,2,0,0,6]},"bbmssn":{"nMssn":156,"nMssnOk":87,"nMssnC":54,"nMssnF":15,"aMssnM":40,"aCycleM":39},"bbrstinfo":{"nNavRst":31,"nMobRst":0,"causes":"0000"}}}}
2021.10.12 15:24:27 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"lastCommand":{"command":"dock","time":1634044399,"initiator":"localApp"},"langs":[{"en-UK":0},{"fr-FR":1},{"es-ES":2},{"it-IT":3},{"de-DE":4},{"ru-RU":5}],"bbnav":{"aMtrack":13,"nGoodLmrks":21,"aGain":12,"aExpo":18},"bbpanic":{"panics":[1,8,8,8,8]},"bbpause":{"pauses":[2,2,17,17,0,6,2,0,0,6]},"bbmssn":{"nMssn":156,"nMssnOk":87,"nMssnC":54,"nMssnF":15,"aMssnM":40,"aCycleM":39},"bbrstinfo":{"nNavRst":31,"nMobRst":0,"causes":"0000"}}}}
2021.10.12 15:24:27 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:27 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"cap":{"pose":1,"ota":2,"multiPass":2,"pp":1,"binFullDetect":1,"langOta":1,"maps":1,"edge":1,"eco":1,"svcConf":1},"hardwareRev":3,"sku":"R96----","batteryType":"li26","soundVer":"32","uiSwVer":"4582","navSwVer":"01.12.01#1","wifiSwVer":"21045","mobilityVer":"5938","bootloaderVer":"4042","umiVer":"6","softwareVer":"v2.4.16-126","tz":{"events":[{"dt":1633089600,"off":120},{"dt":1635642001,"off":60},{"dt":1648342801,"off":120}],"ver":12},"timezone":"Europe/Berlin","name":"Baltrum"}}}
2021.10.12 15:24:27 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"cap":{"pose":1,"ota":2,"multiPass":2,"pp":1,"binFullDetect":1,"langOta":1,"maps":1,"edge":1,"eco":1,"svcConf":1},"hardwareRev":3,"sku":"R96----","batteryType":"li26","soundVer":"32","uiSwVer":"4582","navSwVer":"01.12.01#1","wifiSwVer":"21045","mobilityVer":"5938","bootloaderVer":"4042","umiVer":"6","softwareVer":"v2.4.16-126","tz":{"events":[{"dt":1633089600,"off":120},{"dt":1635642001,"off":60},{"dt":1648342801,"off":120}],"ver":12},"timezone":"Europe/Berlin","name":"Baltrum"}}}
2021.10.12 15:24:27 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:27 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"cleanSchedule":{"cycle":["none","none","none","none","none","none","none"],"h":[11,11,11,11,11,11,11],"m":[0,0,0,0,0,0,0]},"bbchg3":{"avgMin":220,"hOnDock":2190,"nAvail":985,"estCap":7451,"nLithChrg":124,"nNimhChrg":0,"nDocks":79},"bbchg":{"nChgOk":123,"nLithF":0,"aborts":[4,0,0]},"bbswitch":{"nBumper":40160,"nClean":246,"nSpot":11,"nDock":79,"nDrops":103}}}}
2021.10.12 15:24:27 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"cleanSchedule":{"cycle":["none","none","none","none","none","none","none"],"h":[11,11,11,11,11,11,11],"m":[0,0,0,0,0,0,0]},"bbchg3":{"avgMin":220,"hOnDock":2190,"nAvail":985,"estCap":7451,"nLithChrg":124,"nNimhChrg":0,"nDocks":79},"bbchg":{"nChgOk":123,"nLithF":0,"aborts":[4,0,0]},"bbswitch":{"nBumper":40160,"nClean":246,"nSpot":11,"nDock":79,"nDrops":103}}}}
2021.10.12 15:24:27 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:27 5: RoombaFegerClient: received PUBLISH (0)*$aws/things/3192C22060734880/shadow/update{"state":{"reported":{"bbrun":{"hr":114,"min":38,"sqft":453,"nStuck":47,"nScrubs":101,"nPicks":418,"nPanics":82,"nCliffsF":1508,"nCliffsR":3129,"nMBStll":4,"nWStll":1,"nCBump":0},"bbsys":{"hr":2366,"min":0}}}}
2021.10.12 15:24:27 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000$aws/things/3192C22060734880/shadow/update\000{"state":{"reported":{"bbrun":{"hr":114,"min":38,"sqft":453,"nStuck":47,"nScrubs":101,"nPicks":418,"nPanics":82,"nCliffsF":1508,"nCliffsR":3129,"nMBStll":4,"nWStll":1,"nCBump":0},"bbsys":{"hr":2366,"min":0}}}}
2021.10.12 15:24:27 4: MQTT2_DEVICE_Parse: RoombaFeger $aws/things/3192C22060734880/shadow/update => { json2nameValue($EVENT) }
2021.10.12 15:24:31 5: RoombaFegerClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"signal":{"rssi":-48,"snr":40}}}}
2021.10.12 15:24:31 5: RoombaFegerClient: dispatch autocreate=no\0003192C22060734880\000wifistat\000{"state":{"reported":{"signal":{"rssi":-48,"snr":40}}}}
2021.10.12 15:24:31 4: MQTT2_DEVICE_Parse: RoombaFeger wifistat => { json2nameValue($EVENT) }
2021.10.12 15:24:36 5: RoombaFegerClient: sending DISCONNECT (224)(0)
2021.10.12 15:24:36 5: DevIo_SimpleWrite RoombaFegerClient: e000
2021.10.12 15:24:54 1: RMDIR: ./restoreDir/save/2021-04-05
Die Darstellung, irgendetwas "würde nicht klappen", steht im Widerspruch zum Log. Es klappt eben doch.
FHEM verbindet sich mit dem Roboter und empfängt auch Daten. Jetzt muss man "nur" das Richtige senden, dann steuert man ihn auch. Wie das geht, ist im Wiki beschrieben - und das hat _gar nichts_ mit den Installationen zu tun.
Natürlich muss man im RoombaFegerClient "autocreate" auf "simple" stellen, sonst wird das Device eben nicht angelegt.
LG
pah
Ich habe mein (gemäß dem Wiki) angelegten Device also wieder gelöscht und bin durch Ihren Hinweis darauf gekommen, dass ich es gar nicht hätte anlegen müssen. Stattdessen sollte ich Autocreate Simple einstellen damit sich das Device erste einmal selber anlegt. Falls das jetzt so korrekt ist hierr nochmals die Auszüge aus dem Wiki:
zu 1.) im Wiki steht:
Einrichten eines MQTT Device
Definieren Sie in FHEM
define RoombaFeger MQTT2_DEVICE 3###########0
attr RoombaFeger IODev RoombaFegerClient
attr RoombaFeger devicetopic 3###########0
attr RoombaFeger readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
attr RoombaFeger setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"} \
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"} \
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
wobei natürlich wieder die oben erhaltene blid für die fett hervorgehobenen Strings eingesetzt wird. Sie erhalten dadurch ein Device, dass Sie mit FHEM-Kommandos starten und anhalten können. Wenn der Roboter läuft, meldet er eine Vielzahl von Daten an FHEM - und nicht alle davon sind informativ.
zu 2. Außerdem steht im Wiki steht:
attr RoombaFegerClient autocreate no
Ich habe abermals das Wiki gelesen - ohne hiermit in irgend einer Form weiter gekommen zu sein.
Ist es vielleicht das falsche Wiki?
https://wiki.fhem.de/wiki/Roomba
P.S Sobald mein Gerät mal funktioniert bin ich gerne Bereit eine Anleitung zu veröffentlichen, mit der dann auch Anfänger den Roboter zum laufen bringt. Ich wäre sehr froh, wenn Sie mir noch mal einen (hoffentlich letzten) Tipp geben könnten - oder die entscheidende Stelle aus dem Wiki hierhin kopieren.
Vielen Dank und beste Grüße
Internals:
Clients :MQTT2_DEVICE:MQTT_GENERIC_BRIDGE:
ClientsKeepOrder 1
DEF 192.168.0.32:8883
DeviceName 192.168.0.32:8883
FUUID 61646ac5-f33f-5bdf-fdac-f79b518718899633
FVERSION 00_MQTT2_CLIENT.pm:0.249820/2021-09-16
NAME RoombaFegerClient
NR 28
SSL 1
STATE disconnected
TIMEOUT 6
TYPE MQTT2_CLIENT
WBCallback
clientId 3192C22060734880
devioLoglevel 5
disconnectAt 2021-10-13 17:09:30
lastMsgTime 1634137765.79081
nextOpenDelay 5
MatchList:
1:MQTT2_DEVICE ^.
2:MQTT_GENERIC_BRIDGE ^.
READINGS:
2021-10-13 17:09:30 state disconnected
sslargs:
SSL_version SSLv23
Attributes:
SSL 1
autocreate simple
clientId 3XXXXXXXXXXXXXX0
connectTimeout 6
disconnectAfter 5
mqttVersion 3.1.1
room Roomba
sslargs SSL_version:SSLv23
username 3XXXXXXXXXXXXXX0
verbose 0
Das Gerät was angelegt wurde habe ich dann wieder umbenannt, was die Funktion auch nicht zum Leben erweckt hat. Vorher war der Name MQTT2_3XXXXXXXXXX
Internals:
CID
DEF
DEVICETOPIC
FUUID 6166f216-f33f-5bdf-756d-42f26b3770f45c74
FVERSION 10_MQTT2_DEVICE.pm:0.248610/2021-08-20
IODev RoombaFegerClient
LASTInputDev RoombaFegerClient
MSGCNT 103
NAME RoombaFeger
NR 29
RoombaFegerClient_MSGCNT 103
RoombaFegerClient_TIME 2021-10-13 17:09:25
STATE start
TYPE MQTT2_DEVICE
READINGS:
2021-10-13 17:02:50 IODev RoombaFegerClient
2021-10-13 17:09:08 state start
2021-10-13 17:09:17 state_reported_batPct 100
2021-10-13 17:09:17 state_reported_batteryType li26
2021-10-13 17:09:17 state_reported_bbchg3_avgMin 196
2021-10-13 17:09:17 state_reported_bbchg3_estCap 7451
2021-10-13 17:09:17 state_reported_bbchg3_hOnDock 2191
2021-10-13 17:09:17 state_reported_bbchg3_nAvail 988
2021-10-13 17:09:17 state_reported_bbchg3_nDocks 82
2021-10-13 17:09:17 state_reported_bbchg3_nLithChrg 126
2021-10-13 17:09:17 state_reported_bbchg3_nNimhChrg 0
2021-10-13 17:09:17 state_reported_bbchg_aborts_1 4
2021-10-13 17:09:17 state_reported_bbchg_aborts_2 0
2021-10-13 17:09:17 state_reported_bbchg_aborts_3 0
2021-10-13 17:09:17 state_reported_bbchg_nChgOk 124
2021-10-13 17:09:17 state_reported_bbchg_nLithF 0
2021-10-13 17:09:17 state_reported_bbmssn_aCycleM 39
2021-10-13 17:09:17 state_reported_bbmssn_aMssnM 41
2021-10-13 17:09:17 state_reported_bbmssn_nMssn 157
2021-10-13 17:09:17 state_reported_bbmssn_nMssnC 54
2021-10-13 17:09:17 state_reported_bbmssn_nMssnF 15
2021-10-13 17:09:17 state_reported_bbmssn_nMssnOk 88
2021-10-13 17:09:17 state_reported_bbnav_aExpo 8
2021-10-13 17:09:17 state_reported_bbnav_aGain 11
2021-10-13 17:09:17 state_reported_bbnav_aMtrack 17
2021-10-13 17:09:17 state_reported_bbnav_nGoodLmrks 20
2021-10-13 17:09:17 state_reported_bbpanic_panics_1 8
2021-10-13 17:09:17 state_reported_bbpanic_panics_2 1
2021-10-13 17:09:17 state_reported_bbpanic_panics_3 8
2021-10-13 17:09:17 state_reported_bbpanic_panics_4 8
2021-10-13 17:09:17 state_reported_bbpanic_panics_5 8
2021-10-13 17:09:17 state_reported_bbpause_pauses_1 2
2021-10-13 17:09:17 state_reported_bbpause_pauses_10 6
2021-10-13 17:09:17 state_reported_bbpause_pauses_2 2
2021-10-13 17:09:17 state_reported_bbpause_pauses_3 17
2021-10-13 17:09:17 state_reported_bbpause_pauses_4 17
2021-10-13 17:09:17 state_reported_bbpause_pauses_5 0
2021-10-13 17:09:17 state_reported_bbpause_pauses_6 6
2021-10-13 17:09:17 state_reported_bbpause_pauses_7 2
2021-10-13 17:09:17 state_reported_bbpause_pauses_8 0
2021-10-13 17:09:17 state_reported_bbpause_pauses_9 0
2021-10-13 17:09:17 state_reported_bbrstinfo_causes 0000
2021-10-13 17:09:17 state_reported_bbrstinfo_nMobRst 0
2021-10-13 17:09:17 state_reported_bbrstinfo_nNavRst 31
2021-10-13 17:09:17 state_reported_bbrun_hr 115
2021-10-13 17:09:17 state_reported_bbrun_min 27
2021-10-13 17:09:17 state_reported_bbrun_nCBump 0
2021-10-13 17:09:17 state_reported_bbrun_nCliffsF 1513
2021-10-13 17:09:17 state_reported_bbrun_nCliffsR 3132
2021-10-13 17:09:17 state_reported_bbrun_nMBStll 4
2021-10-13 17:09:17 state_reported_bbrun_nPanics 83
2021-10-13 17:09:17 state_reported_bbrun_nPicks 418
2021-10-13 17:09:17 state_reported_bbrun_nScrubs 101
2021-10-13 17:09:17 state_reported_bbrun_nStuck 47
2021-10-13 17:09:17 state_reported_bbrun_nWStll 1
2021-10-13 17:09:17 state_reported_bbrun_sqft 456
2021-10-13 17:09:17 state_reported_bbswitch_nBumper 41044
2021-10-13 17:09:17 state_reported_bbswitch_nClean 248
2021-10-13 17:09:17 state_reported_bbswitch_nDock 82
2021-10-13 17:09:17 state_reported_bbswitch_nDrops 103
2021-10-13 17:09:17 state_reported_bbswitch_nSpot 13
2021-10-13 17:09:17 state_reported_bbsys_hr 2387
2021-10-13 17:09:17 state_reported_bbsys_min 57
2021-10-13 17:09:17 state_reported_binPause true
2021-10-13 17:09:17 state_reported_bin_full false
2021-10-13 17:09:17 state_reported_bin_present true
2021-10-13 17:09:17 state_reported_bootloaderVer 4042
2021-10-13 17:09:17 state_reported_cap_binFullDetect 1
2021-10-13 17:09:17 state_reported_cap_eco 1
2021-10-13 17:09:17 state_reported_cap_edge 1
2021-10-13 17:09:17 state_reported_cap_langOta 1
2021-10-13 17:09:17 state_reported_cap_maps 1
2021-10-13 17:09:17 state_reported_cap_multiPass 2
2021-10-13 17:09:17 state_reported_cap_ota 2
2021-10-13 17:09:17 state_reported_cap_pose 1
2021-10-13 17:09:17 state_reported_cap_pp 1
2021-10-13 17:09:17 state_reported_cap_svcConf 1
2021-10-13 17:09:17 state_reported_carpetBoost true
2021-10-13 17:09:17 state_reported_cleanMissionStatus_cycle none
2021-10-13 17:09:17 state_reported_cleanMissionStatus_error 0
2021-10-13 17:09:17 state_reported_cleanMissionStatus_expireM 0
2021-10-13 17:09:17 state_reported_cleanMissionStatus_expireTm 0
2021-10-13 17:09:17 state_reported_cleanMissionStatus_initiator rmtApp
2021-10-13 17:09:17 state_reported_cleanMissionStatus_mssnM 0
2021-10-13 17:09:17 state_reported_cleanMissionStatus_mssnStrtTm 0
2021-10-13 17:09:17 state_reported_cleanMissionStatus_nMssn 0
2021-10-13 17:09:17 state_reported_cleanMissionStatus_notReady 0
2021-10-13 17:09:17 state_reported_cleanMissionStatus_phase charge
2021-10-13 17:09:17 state_reported_cleanMissionStatus_rechrgM 0
2021-10-13 17:09:17 state_reported_cleanMissionStatus_rechrgTm 0
2021-10-13 17:09:17 state_reported_cleanMissionStatus_sqft 0
2021-10-13 17:09:17 state_reported_cleanSchedule_cycle_1 none
2021-10-13 17:09:17 state_reported_cleanSchedule_cycle_2 none
2021-10-13 17:09:17 state_reported_cleanSchedule_cycle_3 none
2021-10-13 17:09:17 state_reported_cleanSchedule_cycle_4 none
2021-10-13 17:09:17 state_reported_cleanSchedule_cycle_5 none
2021-10-13 17:09:17 state_reported_cleanSchedule_cycle_6 none
2021-10-13 17:09:17 state_reported_cleanSchedule_cycle_7 none
2021-10-13 17:09:17 state_reported_cleanSchedule_h_1 11
2021-10-13 17:09:17 state_reported_cleanSchedule_h_2 11
2021-10-13 17:09:17 state_reported_cleanSchedule_h_3 11
2021-10-13 17:09:17 state_reported_cleanSchedule_h_4 11
2021-10-13 17:09:17 state_reported_cleanSchedule_h_5 11
2021-10-13 17:09:17 state_reported_cleanSchedule_h_6 11
2021-10-13 17:09:17 state_reported_cleanSchedule_h_7 11
2021-10-13 17:09:17 state_reported_cleanSchedule_m_1 0
2021-10-13 17:09:17 state_reported_cleanSchedule_m_2 0
2021-10-13 17:09:17 state_reported_cleanSchedule_m_3 0
2021-10-13 17:09:17 state_reported_cleanSchedule_m_4 0
2021-10-13 17:09:17 state_reported_cleanSchedule_m_5 0
2021-10-13 17:09:17 state_reported_cleanSchedule_m_6 0
2021-10-13 17:09:17 state_reported_cleanSchedule_m_7 0
2021-10-13 17:09:16 state_reported_cloudEnv prod
2021-10-13 17:09:16 state_reported_country DE
2021-10-13 17:09:17 state_reported_dock_known false
2021-10-13 17:09:22 state_reported_echo true
2021-10-13 17:09:17 state_reported_ecoCharge false
2021-10-13 17:09:17 state_reported_hardwareRev 3
2021-10-13 17:09:17 state_reported_langs_1_en-UK 0
2021-10-13 17:09:17 state_reported_langs_2_fr-FR 1
2021-10-13 17:09:17 state_reported_langs_3_es-ES 2
2021-10-13 17:09:17 state_reported_langs_4_it-IT 3
2021-10-13 17:09:17 state_reported_langs_5_de-DE 4
2021-10-13 17:09:17 state_reported_langs_6_ru-RU 5
2021-10-13 17:09:17 state_reported_language 4
2021-10-13 17:09:17 state_reported_lastCommand_command dock
2021-10-13 17:09:17 state_reported_lastCommand_initiator rmtApp
2021-10-13 17:09:17 state_reported_lastCommand_time 1634135991
2021-10-13 17:09:16 state_reported_localtimeoffset 120
2021-10-13 17:09:16 state_reported_mac dc:f5:05:90:83:0b
2021-10-13 17:09:16 state_reported_mapUploadAllowed true
2021-10-13 17:09:17 state_reported_mobilityVer 5938
2021-10-13 17:09:17 state_reported_name Roomba
2021-10-13 17:09:17 state_reported_navSwVer 01.12.01#1
2021-10-13 17:09:16 state_reported_netinfo_addr 3232235552
2021-10-13 17:09:16 state_reported_netinfo_bssid 3c:a6:2f:1e:9e:c4
2021-10-13 17:09:16 state_reported_netinfo_dhcp true
2021-10-13 17:09:16 state_reported_netinfo_dns1 3232235521
2021-10-13 17:09:16 state_reported_netinfo_dns2 0
2021-10-13 17:09:16 state_reported_netinfo_gw 3232235521
2021-10-13 17:09:16 state_reported_netinfo_mask 4294967040
2021-10-13 17:09:16 state_reported_netinfo_sec 4
2021-10-13 17:09:17 state_reported_noAutoPasses true
2021-10-13 17:09:17 state_reported_noPP false
2021-10-13 17:09:17 state_reported_openOnly false
2021-10-13 17:09:16 state_reported_pose_point_x 0
2021-10-13 17:09:16 state_reported_pose_point_y 0
2021-10-13 17:09:16 state_reported_pose_theta 0
2021-10-13 17:09:17 state_reported_schedHold false
2021-10-13 17:09:25 state_reported_signal_rssi -51
2021-10-13 17:09:25 state_reported_signal_snr 38
2021-10-13 17:09:17 state_reported_sku R960040
2021-10-13 17:09:17 state_reported_softwareVer v2.4.16-126
2021-10-13 17:09:17 state_reported_soundVer 32
2021-10-13 17:09:16 state_reported_svcEndpoints_svcDeplId v007
2021-10-13 17:09:17 state_reported_timezone Europe/Berlin
2021-10-13 17:09:17 state_reported_twoPass true
2021-10-13 17:09:17 state_reported_tz_events_1_dt 1633089600
2021-10-13 17:09:17 state_reported_tz_events_1_off 120
2021-10-13 17:09:17 state_reported_tz_events_2_dt 1635642001
2021-10-13 17:09:17 state_reported_tz_events_2_off 60
2021-10-13 17:09:17 state_reported_tz_events_3_dt 1648342801
2021-10-13 17:09:17 state_reported_tz_events_3_off 120
2021-10-13 17:09:17 state_reported_tz_ver 12
2021-10-13 17:09:17 state_reported_uiSwVer 4582
2021-10-13 17:09:17 state_reported_umiVer 6
2021-10-13 17:09:16 state_reported_utctime 1634137755
2021-10-13 17:09:17 state_reported_vacHigh false
2021-10-13 17:09:16 state_reported_wifiAnt 1
2021-10-13 17:09:17 state_reported_wifiSwVer 21045
2021-10-13 17:09:16 state_reported_wifistat_cloud 1
2021-10-13 17:09:16 state_reported_wifistat_uap false
2021-10-13 17:09:16 state_reported_wifistat_wifi 1
2021-10-13 17:09:16 state_reported_wlcfg_sec 7
2021-10-13 17:09:16 state_reported_wlcfg_ssid 404040
Attributes:
IODev RoombaFegerClient
devicetopic
readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
room Roomba
setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"} \
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"} \
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
Das Wiki ist schon das richtige. Bei mir hat es auch mit autocreate no geklappt, habe die Devices manuell angelegt, so wie Du ja anscheinend auch.
Hast Du für das MQTT Device die SetList angelegt?
Dann müsstest Du doch in der Weboberfläche oben bei den Set-Kommandos ein "Start" und ein "Stop" (zum Beispiel) haben!?!
Ich komme selber aber mit den Maps immer noch nicht weiter.
Ich habe jetzt alle (hoffe ich) fehlenden Attribute nachgezogen :
Attributes
IODev RoombaClient
LOG_dir /opt/fhem/log/roomba
SVG_collect /opt/fhem/log/roomba/SVG_Roomba.xml
SVG_color1 green:lightgreen
SVG_color2 orange:yellow
SVG_color3 red:pink
SVG_color4 blue:lightblue
SVG_dir /opt/fhem/www/images/roomba
SVG_final /opt/fhem/www/images/roomba/SVG_Roomba.svg
SVG_room /opt/fhem/www/images/roomba/floorplan.svg
event-aggregator state_reported_signal_rssi:300:none:v
noMap false
readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
startdir north
startx 0
starty 0
Ich starte den Reinigungslauf aus FHEM heraus und mache vorher und hinterher ein "set Maplist"
Es gibt weder im (siehe oben) Verzeichnis "/opt/fhem/log/roomba" irgendeine neue Datei (ich hätte hier die XML mit der Kartenliste erwartet), noch unter "/opt/fhem/www/images/roomba/" ein Ergebnis-SVG.
Vielleicht liegt es auch daran, dass die ich einen J7 (hier nochmal erwähnt) habe und die Karten bei dem anders funktionieren, als beim I7?
Beim J7 gibt es ja diese Zusatzfunktion mit "Hindernis-Fotos" durch die man Sperrzonen anlegen kann.
LG
Mike
Zunächst einmal: Es ist vollkommen egal, ob man die Devices selbst anlegt und autocreate abschaltet. Oder sie per autocreate anlegen lässt. Beides führt (wenn man die korrekten Namen verwendet) zum selben Ergebnis.
Ich kann nur mutmaße, warum mit der angegebenen setList die Kommandos an den Roomba nicht befolgt werden. Tipp: verbose=5 im MQTT-Client setzen und prtokollieren, was wirklich herausgeht.
Das LOG_dir ist für eine textuelle (!) Ausgabe bestimmt - _nicht_ für die Bilder.
SVG_dir ist der Verzeichnisname für die Bilder - und ich denke, dass es nur logisch ist, dass dieser Verzeichnisname _nicht_ noch einmal in den Dateinamen SVG_collect, SVG_room und SVG_final auftaucht. Denn: Eine Datei
/opt/fhem/www/images/roomba//opt/fhem/www/images/roomba/floorplan.svg
gibt es einfach nicht...
Eigentlich sollte dies auch als Fehlermeldung im Log auftauchen.
Die Karten sind übrigens vollkommen unabhängig von der Kartierung in der App, weil nur die alle paar Sekunden übermittelten Positionsdaten verwendet werden.
LG
pah
OK, hätte gedacht, dass ein absoluter Dateiname mit Pfad sicherer ist und das FHEM das "merkt", das es sich nicht um eine relative Pfadangabe (im Extremfall als nur der Dateiname), sondern um eine absolute (der "/" am Anfang) handelt. Bin aber auch auf unixoiden OSen nicht so zu Hause, muss ich zugeben.
Das LogDir, so dachte ich, ist für die Protokollierung der Wegpunkte UND für die erzeugte XML Datei. Bei letzterem kann man natürlich auch argumentieren, dass das ja im Kontext der erzeugten SVGs liegt, als in das SVG_Dir geschrieben wird. Ist das so? Werden die Protokolldateien für den Verfahrensweg nach dem Processing wieder gelöscht, das würde erklären wieso das dann leer ist.
Ich lass den J7 morgen wenn meine Frau weg ist, nochmal mit vollem Log-Gerödel laufen. Der J7 ist zwar im Vergleich zu unserem alten 980er eher unhörbar, aber Ehefrauen sind ja doch etwas sensibler als wir technikaffinen Männer. ;-)
Problem gelöst:
Die SetList muss bei mir so aussehen:
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}
start cmd {"command": "start", "time": 1, "initiator": "localApp"}
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"}
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"}
am Ende darf kein \ stehen (und nicht so wie es in der Anleitung dargestellt war)
Vielen vielen Dank für die große Mühe und Unterstützung!
;-))
Zitat von: SebastianStorb am 17 Oktober 2021, 11:22:19
am Ende darf kein \ stehen (und nicht so wie es in der Anleitung dargestellt war)
Bevor du hier weiter rummaulst: Dir ist schon klar, dass es einen Unterschied gibt, je nachdem, ob man direkt im Attribut editiert oder ein RAW-Listing "für alles" darstellt ::) ?
Für kompletten Code, den man einfach so übernehmen kann, ist RAW-Listing die einfachste Variante, und da gehört dann auch bei Bedarf ein \ an das Ende einer Zeile: https://wiki.fhem.de/wiki/Import_von_Code_Snippets
Damit erledigt sich dann die Frage, ob besagter User irgendeinen Support bekommt.
LG
pah
Zitat von: Beta-User am 17 Oktober 2021, 12:02:38
Bevor du hier weiter rummaulst: Dir ist schon klar, dass es einen Unterschied gibt, je nachdem, ob man direkt im Attribut editiert oder ein RAW-Listing "für alles" darstellt ::) ?
Für kompletten Code, den man einfach so übernehmen kann, ist RAW-Listing die einfachste Variante, und da gehört dann auch bei Bedarf ein \ an das Ende einer Zeile: https://wiki.fhem.de/wiki/Import_von_Code_Snippets
Ich wollte Anderen mit dem gleichen Problem meinen Fehler zeigen und mich für die Unterstützung bedanken und nicht den Eindruck von "rummaulen" hinterlassen. Entschuldigung wenn ich falsch verstanden wurde.
Bezüglich RAS-Listing vs Attribut war mir bisher der Unterschied nicht klar - jetzt schon. Danke nochmal für den Hinweis!
Es ist unglaublich: Mit dem Firmware Update für den i7 vom 27.10.2021 haben die Herrschaften von iRobot die regelmäßigen Positionsmeldungen des Roboters unterdrückt. Möglicherweise sind die noch irgendwo versteckt, oder müssen erst wieder eingeschaltet werden - standardmäßig gibt es aber nichts mehr.
LG
pah
Vielen Dank für die Warnung. Dann lasse ich meinen i7 erstmal nicht weiter ins Internet. Er kommt ohne (mir bekannte) Verbindung zur Außenwelt ganz gut klar. ;-)
Zitat von: Prof. Dr. Peter Henning am 19 November 2021, 12:27:45
Es ist unglaublich: Mit dem Firmware Update für den i7 vom 27.10.2021 haben die Herrschaften von iRobot die regelmäßigen Positionsmeldungen des Roboters unterdrückt. Möglicherweise sind die noch irgendwo versteckt, oder müssen erst wieder eingeschaltet werden - standardmäßig gibt es aber nichts mehr.
LG
pah
Hallo, gibt es dazu schon neue erkenntnisse? Bin gerade am überlegen einen zweiten Roomba zu kaufen und da käme dann auch der i7 in die engere Auswahl.
LG, Jens
Derzeit noch nicht. Ich habe zwar das hier gefunden: https://www.reddit.com/r/roomba/comments/q6t1pj/i7_not_realising_its_in_a_different_location_no/, in dem suggeriert wird, dass sich irgendetwas ändert, wenn der Roomba dreimal hintereinander einen Reset auf die Werkseinstellungen durchführt. Derzeit bin ich aber noch skeptisch, weil das natürlich bedeuten würde, die Kiste dreimal neu im WLAN anzumelden. Und am Ende auch noch erneut mit FHEM zu verbinden. Kostet also ein paar Stunden Zeit, di eich derzeit nicht habe.
LG
pah
OK, etwas Neues.
Unter den Readings des i7 taucht jetzt ein Reading "state_reported_smartHome_homeMonitoringAllowed" auf, das den Wert "false" hat. Ich kann mir durchaus vorstellen, dass damit die lokale Mappingfunktion unterdrückt wird. Allerdings ist dieser Wert mit einem Kommando
Zitat
delta {"state": {"smartHome": {"homeMonitoringAllowed":true}}}
leider nicht änderbar. Bisher fehlt mir noch eine Idee, was man weiterhin ausprobieren kann.
LG
pah
Ich habe noch einen weiteren Eintrag gefunden, im State taucht auch auf
Zitat"featureFlags": {
"quietNav": true,
"homeMonitoring": false,
"clearHaz": true,
"hibLed": 0,
"covPlan": 0,
"ros2SptLvl": true
}
Edit: Lassen sich leider durch einen "delta"-Befehl auch nicht ändern :(
Die Diskussion darüber wird auch hier geführt https://github.com/koalazak/dorita980/issues/148
LG
pah
Hallo,
bin gerade dabei meinen Roomba neu in Fhem einzubinden. Ich gehe nach dem Wiki und der Installationsanleitung von NickWaterton / Roomba980-Python vor.
Leider bekomme ich einen Fehlermeldung denn ich folgendes aufführen möchte:
pip3 install -r ../requirements.txt
ERROR: Failed building wheel for opencv-python
Failed to build opencv-python
ERROR: Could not build wheels for opencv-python which use PEP 517 and cannot be installed directly
Python ist aktuell:
pi@RasPi4:~/Roomba980-Python/roomba $ python -V
Python 2.7.18
pi@RasPi4:~/Roomba980-Python/roomba $ python3 -V
Python 3.9.2
Jens
Zitat von: Sturi2011 am 28 September 2020, 10:24:55
Schau mal bitte in deine \etc\ssl\openssl.conf
Da sollte es einen Wert
CipherString = DEFAULT@SECLEVEL=2
geben. Diesen mal mit # ausremmen oder auf 1 heruntersetzten.
Kurze Anmerkung dazu, da aktuelle Systeme mittlerweile DEFAULT@SECLEVEL=2 haben sollten... Wer nicht die Standardeinstellungen systemweit in
openssl.conf ändern will, kann mit
sslargs
SSL_version:TLSv1_2 SSL_cipher_list:AES256-SHA256auch die passende (schwäre) cipher Konfigurieren.
Testen lässt sich das z.B. einfach mit curl
curl https://192.168.66.6:8883 -k -vvv --tlsv1.2 --ciphers AES256-SHA256https://curl.se/docs/ssl-ciphers.html / bzw.
openssl ciphers [-tls1_2]Gruß,
Thomas
@Jewe: opencv-python wird nicht benötigt. Bei der Installation der Python-Software gibt es irgendeine Option, mit der man die Karten komplett weglassen kann.
LG
pah
Hallo zusammen,
Entschuldigung, aber mein Deutsch nicht so gut ist, so auf Englisch...
Some new features for model s9 and some observations:
1. Command Locate - Roomba makes sound. Second issue of this command stops the sound. To use it just define in setList - Locate:noArg {roomba::command($NAME,"find",$EVENT)}
2. Setting state:childLock (values true, false) - Lock the buttons on Roomba against childs and pets
3. Setting state:gentleMode (values 0,1; 0->disabled, 1-> enabled) - Roomba will be more gentle with your furniture, instead of bumping a lot of times
4. Setting for status lights - state:chrgLrPtrn (values 0, 1, 2; 0-> Charging and docking status, 1->Docking status only, 2-> No status lights)
5. Setting state:audio:active does not exist. Instead there is state:audio:volume (values from 0 to 100). Yes 0 will disable the sound, but you can set what level suits you. By me 50 is good enough.
6. Setting state:noPP cannot be set by user or at least I couldn't. It is possible first something else to be set to proper value like twoPass... (I even don't have an idea what noPP is responsible for...)
7. If you want to set state:twoPass to true, first state:noAutoPasses should be set to true, otherwise nothing will happen (probably this could be automated)
8. If other application (for instance MQTT explorer or Android app) is connected to Roomba's MQTT server, fhem MQTT client cannot connect. The same happens with MQTT explorer if Android App is connected, but if I first connect MQTT explorer and then Android app, MQTT explorer remains connected and both are working properly.
9. Unfortunately after latest firmware upgrade (22.7.2) no positioning data is transmitted, but I will survive this...
10. I also replaced initiator: localApp with initiator: fhem in all commands. Works perfect and it is more clear and informative (at least for me), but I will leave this to the author, more over I don't know if it will work on other models.
I'm not an expert in perl programming (prefer C++ and python) but it was very easy to incorporate the above new settings in the existing code and to test them. Should I upload the code here?
Yes, I'd appreciate this !
Regards
pah
Sending modified code. I changed the name to prevent it from eventual update.
Modifications are in setting($$$), reading($$)
Added: sub numtoenabled($); sub numtostatus($); sub cleanFloor($$)
cleanFloor is based on cleanRoom, but region is empty, so the whole floor will be cleaned.
Just check the differences, please.
After these changes in setList I added:
audioVolume:slider,0,5,100 {roomba::setting($NAME,"audioVolume",$EVENT)}
ChildLock:true,false {roomba::setting($NAME,"childLock",$EVENT)}
GentleMode:disabled,enabled {roomba::setting($NAME,"gentleMode",$EVENT)}
StatusLights:0,1,2 {roomba::setting($NAME,"chrgLrPtrn",$EVENT)}
Locate:noArg {roomba::command($NAME,"find",$EVENT)}
Danke
Thank you, I will try to integrate this into the other stuff (and mention you as contributor). Might take some days, though.
Regards
pah
Keine problemme, es funktioniert beim mir, so egal wie viel lang es wird.
Is your repository part of FHEM update or I should explicitly add it in order to obtain the latest updates of this package?
Danke
Mixed answer: Many of my modules are part of the official FHEM distro (22 by last count). RoombaUtils not yet, because it is just a collection of routines so far.
Regards
pah
ok. Thank you
Also you can consider more easy programming - Instead of setting some parameters manually - copy what Android app is doing (custom mode) - "Extra clean" mode sets first noAutoPasses to true and then twoPass to true. "Daily clean" mode sets only twoPass to false but doesnt set noAutoPasses, and "Room-size Clean" sets noAutoPasses to false (and if twoPass is true - set it to false)
I hope this will help
PS: Tested on my s9... Dont know about others...
Danke schoen
I found one more command - train - Roomba will make map only without cleaning. Roomba still needs at least 2 passes to create the new map. To use the command just add to setList - Map:noArg {roomba::command($NAME,"train",$EVENT)}
Hallo Zusammen,
haben meinen Roomba i7 gerade nach dem Wiki-Eintrag angelegt. Die Readings kommen teilweise aber der Roomba reagiert auf keinerlei Kommandos (start, stop, etc.). Ist das normal, dass das der MQTT2_CLIENT immer auf disconnected steht und nur nach einem manuellen connect kurz auf opened. Im Log (Verbose 5) habe ich keine Fehlermeldungen gefunden. Vielen Dank vorab!
Grüße
Flo
ZitatIst das normal, dass das der MQTT2_CLIENT immer auf disconnected steht
Nein.
LG
pah
Ist bei mir aber auch so - nach einem manuellen connect geht der Client nach 5s (disconnectAfter = 5) wieder auf disconnected.
Aktualisieren sich denn Deine Readings nach einem manuellen connect?
Ja die aktualisieren aber halt nur einmalig. Hast du eine Ahnung woran das liegen kann? Sagt das Attribut nicht genau das?
Genau so ist es ;)
Probier mal das disconnectAfter auf 300 zu setzen und dann ein Start command abzusetzen.
Also habe gerade den Wert auf 300 gesetzt. Leider nimmt er immer noch keine Kommandos entgegen. Wobei sich mir da die nächste Frage aufdrängt: was passiert denn wenn er so länger wie 5 Minuten läuft? Bekomme ich dann in FHEM noch die aktuellen Readings? Frage deswegen, da ich den Event brauche, wenn er auf dem Weg zu seiner Homebase ist, da ich dieses wiederum verwende um seine Garage zu öffnen. Vielen Dank für deine schnelle Hilfe.
Readings kommen nur wenn der Client connected ist.
Mein i7 braucht das Start command meistens zweimal. Wenn er dann unterwegs solltest Du den Statuswechsel in den Readings sehen. Was passiert wenn Du connected bist und Du ihn manuell startest? Dann sollten im Log Nachrichten zu sehen sein.
Also jetzt geht es. Habe das zweite SetList Attribut aus der Anleitung durch das erste ersetzt und es funktioniert. Der Start hat auch beim ersten Mal funktioniert. Wobei wenn es sich in der Praxis rausstellt, dass er es zweimal braucht, kann man das ja einfach mit einem Notify lösen, das ihn nochmal startet, wenn er nach X Sekunden nicht läuft.
Was jetzt aber komisch ist: Seitdem ich das DisconnectAfter auf 300 gestellt habe, diconnected er gar nicht mehr. Die Client ist dauerhaft auf opened. Ist das aus irgendeinem Grund problematisch? Und könnte ich dies auch auf z.B. auf 3600 (länger als 1 Stunde ist er nie unterwegs) stellen?
Bzw. macht es Sinn den Client manuell zu disconecten, sobald er wieder auf der Station steht um die Systemauslastung zu reduzieren?
Hallo Zusammen,
um herauszufinden welches der Readings sich für mein Event "Roomba ist endgültig fertig und will zurück zur Homebase" eignet, habe ich nun mal das Reading "
state_reported_cleanMissionStatus_phase" gelogged und den Roomba laufen lassen. Bei einem Blick in die DB finde ich nun den Ablauf der Readingswerte
-> run -> [hmMidMsn] -> 24 Sekunden später wieder -> run -> 33 Sekunden später dann -> [hmPostMsn] -> und zuletzt 28 Sekunden später charge
Kann mir vielleicht jemand von den anwesenden Profis sagen inwiefern sich
hmPostMsn und
hmMidMsn unterscheiden bzw. was diese genau aussagen (hm steht für home würde ich mal wild spekulieren ;) - nur der Rest ist unklar) ?
Oder würde sich ein anderes Reading hier besser eignen?Etwas anderes als @hapege in seinem Post #294 schrieb, habe ich leider nicht gefunden:
Zitat von: hapege am 11 März 2021, 23:21:10
Und beim missionmanager ist der normale i7 Ablauf wohl
charge -> run -> hmPostMsn -> evac -> hmPostMsn -> run -> charge
Vielen Dank im Voraus!
Erstmal an Alle:
Dadurch, dass Amazon iRobot gekauft hat, ergeben sich erhebliche Datenschutzprobleme. Mal sehen, was man machen kann.
@Floriky:
Home Mid Mission = Während der "Mission"
Home Post Mission = Nach der "Mission"
Zum Thema disconnect: bei mir läuft für jeden der drei Roboter ein DOIF
DEF RoombaEmmaCycle DOIF (([RoombaEmmaClient] eq "disconnected") and ([RoombaEmma] =~ /Mission/))
(set RoombaEmmaClient connect)
DOELSEIF
(([RoombaEmmaClient] eq "disconnected") and ([RoombaEmma] =~ /Stopped/))
(set RoombaEmmaClient connect)
DOELSEIF
(([RoombaEmmaClient] eq "disconnected") and ([RoombaEmma] =~ /Stuck/))
(set RoombaEmmaClient connect)
DOELSEIF
(([RoombaEmmaClient] eq "disconnected") and ([RoombaEmma] =~ /User Docking/))
(set RoombaEmmaClient connect)
DOELSEIF
(([RoombaEmmaClient] eq "disconnected") and ([RoombaEmma] =~ /Charge \(\d\d? \%\)/))
(set RoombaEmmaClient connect)
mit Attributwerten
do always
group Staubsaugen
room Kontrollraum
stateFormat {my $v=ReadingsVal("RoombaEmmaCycle","cmd","");;"Reconnect in $v => ".(($v==1)?"Mission":(($v==2)?"Pause":(($v==3)?"Stuck":"Charge" )))." ".ReadingsTimestamp("RoombaEmmaCycle","cmd","")}
Das RoombaEmmaClient Device hat Attribute
connectTimeout 6
disconnectAfter 7
stateFormat {my $v=ReadingsVal("RoombaEmmaClient","state","");;(($v =~ /opened/)?$v." (".AttrVal("RoombaEmmaClient","disconnectAfter","")." s)":$v)}
Während die Kiste geladen wird, erfolgt also regelmäßig ein reconnect, damit ich den Wechsel im Ladezustand mitbekomme.
LG
pah
grüß euch!
ich bin ja eigentlich aus der neato-ecke. leider geht der d10 von denen so überhaupt gar nicht ... die firma entwickelt sich gerade zur witze bude.
jetzt frag ich mich, wies hier bei fhem mit roomba ausschaut. vor allem, weil ich lese, das dieses modul nicht mehr weiter entwickelt wird. ist die aussage noch aktuell, werden alle rooma's oder nur bestimmte unterstützt. und ja gibt's was anderes für fhem, wenn dieses modul wirklich am sterben ist?
und ja, wenn ich gleich dazu fragen darf, wie zufrieden ihr so mit euren irobots seit. wenn das wer mit neato vergleichen könnte ... würde mich nicht beschweren. ich nehm' auch gern jeden hinweis zu brauchbaren und aktuellen nicht chinesischen putzen, die fhem steuern kann. aber da sollten wir vielleicht dann nen eigenen fred machen für *g*
Das machen wir auch längst nicht mehr mit dem Modul, sondern über MQTT und eine Handvoll Hilfsroutinen.
LG
pah
danke dir!
ich will nicht wieder so einfahren wie mit meinem ersten lg und dem neuen neato, drum darf ich noch nerven?
1) d.h. dann, dass die (alle?) roomba generell mqtt können und man nix routen, flashen, ... muss?
2) rennen die dinger auch, wenn sie nicht ins große, weite zwischennetz dürfen, sondern nur ins lokale netz?
Hi,
mein E5 hat schon länger Internetverbot... d.h. per DHCP gibt es kein default gateway und DNS Server. Über FHEM lässt er sich steuern, über die App natürlich nicht mehr. Der e5 ist aber nicht so "schlau" - hat weniger Funktionen (keine reinigungskarten, etc.), ob das bei anderen Modellen auch problemlos klappt kann ich nicht sagen.
Bei Aussagen funktioniert "alles" und "generell" wäre ich vorsichtig... je nach firmware Version gab es auch hier im Thread schon größere Änderungen.
Gruß,
Thomas
thx für die info.
naja, karten brauch ich auf jeden fall, nogo ebenfalls. ich will nicht immer permanentreinigungen machen, sondern immer nur kleine teile. das nervt weniger, wenn man mal zuhause ist *g*.
und meine holde vermisst derzeit gar bitterlich ihre teilreinigungen wie z.b. küche oder das "katzeneck" - das liegt aber daran, dass man bei neato derzeit keine 2 handys mit gleichen user zum steuern nehmen kann und deren seit 3 jahren versprochene apiv2 immer noch nicht existent ist um das ding per fhem zu steuern.
app brauch ich auch keine - dafür hab ich ja fhem, damit die steuerung intelligenter wird.
das ist derzeit mein problem #2: ich kann nicht mehr per fhem steuern und stelle fest, wie schön das war, wen der bot nach feiertagen und ab/an-wesenheit der bewohner fährt, nach offenen/geschlossenen türen verschiedenen reinigungsprogramme startet, usw.
Hallo zusammen,
Ich habe aktuell erfolgreich einen neuen Roomba s9 mittels MQTT2_CLIENT in FHEM integriert. Natürlich leider ohne Koordinaten um eine Map zu zeichnen.
Bereits früher hatte ich einen Roomba 980 Mit dem Modul von Torsten Pferdekämpfer integriert. Da ich grundsätzlich die Roombas nicht ins Internet kommunizieren lasse, ausser gerade zum in Betrieb nehmen, ist der 980 noch auf einem Firmware Stand der noch immer die Positionsdaten liefert, die ich selber in einen rudimentäre SVG Map anzeigen liess. Aktuell läuft diese Integration bei mir weiterhin klaglos. Ich möchte den nun gerne aber auch mit dem MQTT2_CLIENT in FHEM integrieren. Alle bisherigen Versuche sind fehlgeschlagen. Die Passwörter und BLID habe ich mittels dorita980 mit dem Java Script und npm run get-password-cloud. Dabei werden Passwörter und BLID beider Roombas ausgelesen. BLID und Passwort des Roomba 980 sind nach wie vor identisch zur ursprünglichen Installation. Ich habe diese für die Konfiguration genutzt.
- Betriebssystem: Ubuntu LTS 22.04 auf Intel-NUC
- Openssl Version: 3.0.2
- Roomba 980 Firmware Version: v2.4.6-3
- Die bestehende Installation mit dem Modul von Torsten Pferdekämpfer läuft auf einem separaten Raspberry und ist aktuell ausgeschaltet.
- Die Roomba App ist nicht aktiv und der Roomba 980 hat keinen Internet Zugang.
Event Log mit Client & Device auf Verbose 5:
2022.09.03 18:09:45 5 : HttpUtils url=https://192.168.x.y:8883/ NonBlocking via https
2022.09.03 18:09:45 4 : IP: 192.168.x.y -> 192.168.x.y
2022.09.03 18:09:45 4 : HttpUtils: 192.168.x.y: Connection refused (111)
2022-09-03 18:09:45 MQTT2_CLIENT Dobby.980.Client connect
2022.09.03 18:09:53 5 : HttpUtils url=https://192.168.x.y:8883/ NonBlocking via https
2022.09.03 18:09:53 4 : IP: 192.168.x.y -> 192.168.x.y
2022.09.03 18:09:59 5 : HttpUtils url=https://192.168.x.y:8883/ NonBlocking via https
2022.09.03 18:09:59 4 : IP: 192.168.x.y -> 192.168.x.y
2022.09.03 18:10:06 5 : HttpUtils url=https://192.168.x.y:8883/ NonBlocking via https
2022.09.03 18:10:06 4 : IP: 192.168.x.y -> 192.168.x.y
2022.09.03 18:10:14 5 : HttpUtils url=https://192.168.x.y:8883/ NonBlocking via https
2022.09.03 18:10:14 4 : IP: 192.168.x.y -> 192.168.x.y
2022.09.03 18:10:22 5 : HttpUtils url=https://192.168.x.y:8883/ NonBlocking via https
2022.09.03 18:10:22 4 : IP: 192.168.x.y -> 192.168.x.y
List des Client:
Internals:
BUF
Clients :MQTT2_DEVICE:MQTT_GENERIC_BRIDGE:
ClientsKeepOrder 1
DEF 192.168.x.y:8883
DeviceName 192.168.x.y:8883
FUUID 63136ebf-f33f-cace-b777-3954f18f5dfd2f13
NAME Dobby.980.Client
NEXT_OPEN 1662233101.62816
NR 189
PARTIAL
SSL 1
STATE disconnected
TYPE MQTT2_CLIENT
clientId 6##############0
connecting 1
devioLoglevel 5
eventCount 12
nextOpenDelay 5
MatchList:
1:MQTT2_DEVICE ^.
2:MQTT_GENERIC_BRIDGE ^.
READINGS:
2022-09-03 21:24:56 state disconnected
sslargs:
SSL_version SSLv23
Attributes:
SSL 1
autocreate no
clientId 6##############0
disconnectAfter 5
group 10 MQTT2 Clients
mqttVersion 3.1.1
room Roomba
sortby mqtt.cl.02
sslargs SSL_version:SSLv23
username 6##############0
verbose 5
List des Devices:
Internals:
CID 6##############0
DEF 6##############0
FUUID 63136ebf-f33f-cace-aac0-9a28b3ec055c31e6
IODev Dobby.980.Client
NAME Dobby.980
NR 199
STATE ???
TYPE MQTT2_DEVICE
READINGS:
2022-09-03 17:11:59 IODev Dobby.980.Client
Attributes:
IODev Dobby.980.Client
alias Dobby 980
devicetopic 6##############0
group 02 Dobby 980
readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
room Roomba
setList start:noArg {roomba::command($NAME,"start",$EVENT)}
stop:noArg {roomba::command($NAME,"stop",$EVENT)}
dock:noArg {roomba::command($NAME,"dock",$EVENT)}
resume:noArg {roomba::command($NAME,"resume",$EVENT)}
pause:noArg {roomba::command($NAME,"pause",$EVENT)}
CarpetBoost:true,false {roomba::setting($NAME,"carpetBoost",$EVENT)}
TwoPass:true,false {roomba::setting($NAME,"twoPass",$EVENT)}
NoAutoPasses:true,false {roomba::setting($NAME,"noAutoPasses",$EVENT)}
NoPP:true,false {roomba::setting($NAME,"noPP",$EVENT)}
VacHigh:true,false {roomba::setting($NAME,"vacHigh",$EVENT)}
BinPause:true,false {roomba::setting($NAME,"binPause",$EVENT)}
OpenOnly:true,false {roomba::setting($NAME,"openOnly",$EVENT)}
ProgHold:true,false {roomba::setting($NAME,"schedHold",$EVENT)}
ProgSun:time {roomba::setsched($NAME,0,$EVENT)}
ProgMon:time {roomba::setsched($NAME,1,$EVENT)}
ProgTue:time {roomba::setsched($NAME,2,$EVENT)}
ProgWed:time {roomba::setsched($NAME,3,$EVENT)}
ProgThu:time {roomba::setsched($NAME,4,$EVENT)}
ProgFri:time {roomba::setsched($NAME,5,$EVENT)}
ProgSat:time {roomba::setsched($NAME,6,$EVENT)}
maplist:noArg {roomba::setting($NAME,"local:cmMapList={listmaps('$NAME')}",$EVENT)}
mapdel {roomba::setting($NAME,"local:cmMapList={delmap('$NAME','$EVENT')}",$EVENT)}
stateFormat cmPhaseE (battery %)
Was habe ich bisher versucht :
- CipherString von 2 auf 1 gesetzt
- In openssl.cnf ist zusätzlich definiert: MinProtocol = TLSv1.2. Gleiches Verhalten wenn ich das auskommentiere
- bei Änderungen an /etc/ssl/openssl.cnf jeweils neu gebooted.
- Roomba 980 Batterie entfernt und Roomba Hardware Reset ausgeführt
- Port 1883 probiert, dann kommen dauernd connection refused Meldungen
Hat jemand allenfalls noch einen Tipp was ich versuchen könnte oder wo ich suchen müsste?
Herzlichen Dank für eure Unterstützung
Philipp
Hallo zusammen,
hat jemand den iRobot Roomba i6158 erfolgreich eingerichtet, bzw. ist es bekannt ob der auch funktioniert ?
Danke, Jens
@pschlaeppi:
Vlt. mal autocreate=simple setzen.
LG
pah
Hey,
"NonBlocking via https" hatte ich auch. Nach dem ich den Timeout hochgesetzt habe ist das nun weg:
attr RoombaDGClient connectTimeout 6
Allerdings bekomme ich nun noch diese Meldungen im LOG:
2022.10.18 22:06:10 5: RoombaDGClient: received PUBLISH (0)(8)wifistat{"state":{"reported":{"signal":{"rssi":-42,"snr":47}}}}
2022.10.18 22:06:10 5: RoombaDGClient: dispatch autocreate=no\0003xxxxxxxxxxxxxxx0\000wifistat\000{"state":{"reported":{"signal":{"rssi":-42,"snr":47}}}}
2022.10.18 22:06:10 1: ERROR evaluating my $CID= $evalSpecials->{'%CID'};my $DEVICETOPIC= $evalSpecials->{'%DEVICETOPIC'};my $EVENT= $evalSpecials->{'%EVENT'};my $EVTPART0= $evalSpecials->{'%EVTPART0'};my $JSONMAP= $evalSpecials->{'%JSONMAP'};my $NAME= $evalSpecials->{'%NAME'};my $TOPIC= $evalSpecials->{'%TOPIC'};{roomba::reading($NAME,$EVENT)}: Undefined subroutine &roomba::reading called at (eval 39541) line 1.
2022.10.18 22:06:15 5: RoombaDGClient: sending DISCONNECT (224)(0)
2022.10.18 22:06:15 5: DevIo_SimpleWrite RoombaDGClient: e000
Grüße, Jens
Tja, wenn das Modul nicht ordentlich geladen wird, kann FHEM natürlich die Routine roomba::reading nicht finden. Steht doch alles in der Meldung...
LG
pah
Hallo,
heute habe ich den iRobot Roomba i6158 erfolgreich in Betriebgenommen.
Allerding habe ich es nocht nicht ganz kapiert, wie das mit den Karten funktioneren soll. Wenn es funktioniert, wo wird die Karte gespeichert ?
LG, Jens
Es ist mir gelungen, den iRobot Roomba s9+ (mit Absaugstation) in FHEM zu integrieren. Ich kann ihn Starten, Stoppen usw. aber an den Karten habe ich mich nicht versucht.
Ich habe mich dabei hauptsächlich an die Anleitung im FHEM Wiki (https://wiki.fhem.de/wiki/Roomba) gehalten:
- Roboter mit der iRobot APP in Betrieb genommen
- blid und password des Roboters habe ich mit der Anwendung Roomba980 (https://github.com/NickWaterton/Roomba980-Python) aus der "iRobot cloud" ausgelesen (aus dem Roboter selber ging es nicht).
- Den MQTT Client (heißt bei mir RoombaClient) angelegt und das Passwort gesetzt (set RoombaClient password :1:xxxxxxxxxxxxxxxxxxxxxxxxxxxx)
Dann konnte ich (für jeweils 5 Sekunden) eine Verbindung mit dem Roboter aufbauen. - Den Roboter (heißt bei mir Roomba) angelegt.
Nun kamen schon nach jedem Verbinden des RoombaClient viele Daten vom Roboter in Roomba. - Die 99_RoombaUtils.pm vom Unterordner contrib in den Unterordner FHEM kopiert und FHEM neu gestartet, damit sie auch wirklich geladen ist.
- Die Readingslist von Roomba angepasst und damit die Readings deutlich reduziert.
- Sie setlist und webCmd um die Absaugung (evac) erweitert.
- Ein at eingerichtet, um alle 15 min die Daten abzurufen.
So sieht das nun in der
fhem.cfg bei mir aus. Vielleicht nutzt es ja anderen Anwendern, die x müssen natürlich durch die
IP und die
blid ersetzt werden:
######################################################
# iRobot Roomba s9+
######################################################
define RoombaClient MQTT2_CLIENT 192.168.xxx.xxx:8883
attr RoombaClient SSL 1
attr RoombaClient autocreate no
attr RoombaClient clientId 6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5
attr RoombaClient disconnectAfter 5
attr RoombaClient mqttVersion 3.1.1
attr RoombaClient room Roomba
attr RoombaClient sslargs SSL_version:SSLv23
attr RoombaClient username 6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5
attr RoombaClient webCmd connect
define Roomba MQTT2_DEVICE 6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5
attr Roomba userattr noMap:true,false
attr Roomba IODev RoombaClient
attr Roomba alias Roomba i9+
attr Roomba comment ohne RoombaTools:\
attr Roomba readingList $DEVICETOPIC:.* { json2nameValue($EVENT) }
attr Roomba devicetopic 6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5
attr Roomba icon vacuum_top
attr Roomba noMap true
attr Roomba readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
attr Roomba room Roomba
attr Roomba setList start cmd {"command": "start", "time": 1, "initiator": "localApp"} \
dock cmd {"command": "dock", "time": 1, "initiator": "localApp"} \
resume cmd {"command": "resume", "time": 1, "initiator": "localApp"} \
pause cmd {"command": "pause", "time": 1, "initiator": "localApp"}\
evac cmd {"command": "evac", "time": 1, "initiator": "localApp"}
attr Roomba webCmd start:dock:resume:pause:evac
define RoombaUpdate at +*00:15 set RoombaClient connect
attr RoombaUpdate room Roomba
Ich danke allen, die an diesen Thema mitgearbeiten, allen voran Prof. Dr. Peter Henning, für die tolle Arbeit, die es auch mir ermöglicht hat dies nachzuvollziehen und umzusetzen.
Zitat von: Miami am 21 Oktober 2022, 19:51:37
...Ein at eingerichtet, um alle 15 min die Daten abzurufen...
Falls für Dich von Interesse, gäbe es auch diese Alternative mit periodicCmd:
setlist im Roomba ergänzen um
update:noArg {fhem("set RoombaClient connect")}
dann das Attribut periodicCmd dem Roomba hinzufügen:
attr Roomba periodicCmd update:15
Dann brauchst kein extra at mehr ;)
VG
rob
Danke!
Deine Erläuterung habe ich verstanden. :)
Ich meine, das wurde in diesen Tread zwar auch schon mal erwähnt, aber da hatte ich nicht verstanden, wo und was ich eingeben muss.
Ausprobiert habe ich es aber noch nicht. :-[
Weit vorne in diesem Thread wird über das gezielte Ansteuern von Zonen/Räumen geschrieben. Die da genannten Readings finde ich in meinem Braava Wischroboter sowie im Roomba I7 - auch nicht, wenn ich zeitweise auf "complex" im MQTT_CLIENT gehe.
Gibt es mittlerweile bei anderen eine etablierte Möglichkeit, über FHEM gezielt Reinigungszonen anzusteuern, die man zuvor (anders geht es wohl nicht) in der App definiert hat? Die App hat bei mir gewöhnlich keinen Internetzugang. Den hatte ich nur mal ganz zu Beginn aktiv, um die Geräte kennenzulernen.
Gruß
Christian
Klar geht das - und es sind auch keine Readings, sondern Attribute, genauer: User-Attribute userattr. Die verbinden benannte Zonen mit den Zonen-Identifiern aus dem Roomba.
Hier mal ein List eines meiner drei Roboter. Mit dem Befehl "set RoombaEmma CleanEG Sitzgruppe" schicke ich ihn gezielt zur Sitzgruppe
Internals:
CID xxxxxxxxxxxxx
DEF xxxxxxxxxxxxx
FUUID 60e322df-f33f-8771-a8d6-2b967edc3a8c6a7e
IODev RoombaEmmaClient
LASTInputDev RoombaEmmaClient
MSGCNT 1311
NAME RoombaEmma
NR 184
RoombaEmmaClient_MSGCNT 1311
RoombaEmmaClient_TIME 2023-12-26 13:39:08
STATE Charge (100 %), client disconnected
TYPE MQTT2_DEVICE
VERSION 1.3
eventCount 1388
READINGS:
2023-12-24 21:08:04 IODev RoombaEmmaClient
2023-12-26 13:34:14 NumOfSchedules 0
2023-12-26 13:34:14 audioVolume 100
2023-12-26 13:34:14 battery 100
2023-12-26 13:39:01 bbrEvacs 0
2023-12-26 13:39:01 bbrTime :
2023-12-26 13:39:01 bbrTime2 0d 0h m
2023-12-26 13:34:14 cmBinFull false
2023-12-26 13:39:01 cmCycle none
2023-12-26 13:39:01 cmError None
2023-12-26 13:39:01 cmErrorD Kein Fehler
2023-12-26 13:39:01 cmExpire Never
2023-12-26 13:39:01 cmInitiator localApp
2023-12-26 13:39:01 cmNotReady false
2023-12-26 13:39:01 cmPhase charge
2023-12-26 13:39:01 cmPhaseD Ladung
2023-12-26 13:39:01 cmPhaseE Charge
2023-12-26 13:39:01 cmTime 0 min
2023-12-26 13:38:56 dockKnown true
2023-12-26 13:34:14 lastCommand start
2023-12-26 13:34:14 lastCommandInitiator localApp
2023-12-26 13:39:15 mqttclient disconnected
2023-12-26 13:34:14 sBinPause true
2023-12-26 13:34:14 sCarpetBoost false
2023-12-26 13:34:14 sNoAutoPasses true
2023-12-26 13:34:14 sOpenOnly true
2023-12-26 13:34:14 sSchedHold false
2023-12-26 13:34:14 sTwoPass false
2023-12-26 13:34:14 sVacHigh false
2023-12-26 13:34:14 signalAP FritzRepeater3000
2023-12-26 13:34:14 signalBssid 0c:72:74:aa:d6:46
2023-12-26 13:39:08 signalRSSI -55
2023-12-26 13:34:13 state CleanEG
helper:
Attributes:
IODev RoombaEmmaClient
SVG_collect SVG_RoombaEmma.xml
SVG_color1 green:lightgreen
SVG_color2 orange:yellow
SVG_color3 red:pink
SVG_color4 blue:lightblue
SVG_final SVG_RoombaEmma.svg
SVG_room SVG_EG.svg
babbleName Staubsauger_1
devStateIcon Charge.*100.*:vacuum_red Charge.*9\d.*:vacuum_yellow_90 Charge.*8\d.*:vacuum_yellow_80 Charge.*7\d.*:vacuum_yellow_70 Charge.*6\d.*:vacuum_yellow_60 Charge.*5\d.*:vacuum_yellow_50 Charge.*4\d.*:vacuum_yellow_40 Charge.*3\d.*:vacuum_yellow_30 Charge.*2\d.*:vacuum_yellow_20 Charge.*1\d.*:vacuum_yellow_10 Mission.*100.*:vacuum_green_100 Mission.*9\d.*:vacuum_green_90 Mission.*8\d.*:vacuum_green_80 Mission.*7\d.*:vacuum_green_70 Mission.*6\d.*:vacuum_green_60 Mission.*5\d.*:vacuum_green_50 Mission.*4\d.*:vacuum_green_40 Mission.*3\d.*:vacuum_green_30 Mission.*2\d.*:vacuum_green_20 Mission.*1\d.*:vacuum_green_10
devicetopic yyyyyyyyyyyy
floor_Erdgeschoss_label Erdgeschoss
floor_Erdgeschoss_pMapId zzzzzzzzz
floor_Erdgeschoss_userPmapvId 221106T121339
group Staubsaugen
noMap true
readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
room Kontrollraum
room_Erdgeschoss_floor Terrassentür
room_Erdgeschoss_id 3
room_Erdgeschoss_label Erdgeschoss
room_Esstisch_floor Erdgeschoss
room_Esstisch_id 0
room_Esstisch_label Esstisch
room_Esstisch_type zid
room_Garderobe_floor Erdgeschoss
room_Garderobe_id 4
room_Garderobe_label Garderobe
room_Garderobe_type rid
room_Kaminofen_floor Erdgeschoss
room_Kaminofen_id 4
room_Kaminofen_label Kaminofen
room_Kaminofen_type zid
room_Kueche_floor Erdgeschoss
room_Kueche_id 3
room_Kueche_label Küche
room_Kueche_type rid
room_Kuechentuer_floor Erdgeschoss
room_Kuechentuer_id 5
room_Kuechentuer_label Kuechentuer
room_Kuechentuer_type zid
room_Mittendrin_floor Erdgeschoss
room_Mittendrin_id 6
room_Mittendrin_label Mittendrin
room_Mittendrin_type zid
room_Sitzgruppe_floor Erdgeschoss
room_Sitzgruppe_id 1
room_Sitzgruppe_label Sitzgruppe
room_Sitzgruppe_type zid
room_Terrassentuer_floor Erdgeschoss
room_Terrassentuer_id 3
room_Terrassentuer_label Terrassentuer
room_Terrassentuer_type zid
room_VorSchrank_floor Erdgeschoss
room_VorSchrank_id 2
room_VorSchrank_label VorSchrank
room_VorSchrank_type zid
room_Wohnzimmer_floor Erdgeschoss
room_Wohnzimmer_id 1
room_Wohnzimmer_label Wohnzimmer
room_Wohnzimmer_type rid
setList start:noArg {roomba::command($NAME,"start",$EVENT)}
stop:noArg {roomba::command($NAME,"stop",$EVENT)}
dock:noArg {roomba::command($NAME,"dock",$EVENT)}
resume:noArg {roomba::command($NAME,"resume",$EVENT)}
pause:noArg {roomba::command($NAME,"pause",$EVENT)}
Allow:true,false {roomba::allow()}
CarpetBoost:true,false {roomba::setting($NAME,"carpetBoost",$EVENT)}
TwoPass:true,false {roomba::setting($NAME,"twoPass",$EVENT)}
NoAutoPasses:true,false {roomba::setting($NAME,"noAutoPasses",$EVENT)}
NoPP:true,false {roomba::setting($NAME,"noPP",$EVENT)}
VacHigh:true,false {roomba::setting($NAME,"vacHigh",$EVENT)}
BinPause:true,false {roomba::setting($NAME,"binPause",$EVENT)}
OpenOnly:true,false {roomba::setting($NAME,"openOnly",$EVENT)}
ProgHold:true,false {roomba::setting($NAME,"schedHold",$EVENT)}
ProgSun:time {roomba::setsched2($NAME,0,$EVENT)}
ProgMon:time {roomba::setsched2($NAME,1,$EVENT)}
ProgTue:time {roomba::setsched2($NAME,2,$EVENT)}
ProgWed:time {roomba::setsched2($NAME,3,$EVENT)}
ProgThu:time {roomba::setsched2($NAME,4,$EVENT)}
ProgFri:time {roomba::setsched2($NAME,5,$EVENT)}
ProgSat:time {roomba::setsched2($NAME,6,$EVENT)}
maplist:noArg {roomba::listmaps($NAME)}
mapdel {roomba::delmap($NAME,$EVENT)}
SetScheduleAll:true,false {roomba::setsched2($NAME,"all",$EVENT)}
SetSchedule1:true,false {roomba::setsched2($NAME,"1",$EVENT)}
SetSchedule2:true,false {roomba::setsched2($NAME,"2",$EVENT)}
CreateFloor {roomba::createFloor($NAME,$EVENT)}
CreateRoom {roomba::createRoom($NAME,$EVENT)}
CleanEG:Sitzgruppe,Kaminofen,Terrassentuer,VorSchrank,Mittendrin,Esstisch,Kuechentuer,Kueche,Garderobe,Wohnzimmer {roomba::cleanRoom($NAME,"Erdgeschoss",$EVENT)}
startdir north
startx 1080
starty 500
stateFormat cmPhaseE (battery %), client mqttclient
userReadings signalAP:.*signalBssid.* {my $bssid=ReadingsVal('RoombaEmma','signalBssid','');;(($bssid=~/44.*20/)?'FritzBox':(($bssid=~/e8.*0f/)?'FritzRepeater1750':'FritzRepeater3000'))}, mqttclient:.* {Value("RoombaEmmaClient")}
userattr LOG_dir SVG_collect SVG_color1 SVG_color2 SVG_color3 SVG_color4 SVG_dir SVG_final SVG_room debug floor_Erdgeschoss_label floor_Erdgeschoss_pMapId floor_Erdgeschoss_userPmapvId noMap:true,false room_Erdgeschoss_floor room_Erdgeschoss_id room_Erdgeschoss_label room_Erdgeschoss_type room_Esstisch_floor room_Esstisch_id room_Esstisch_label room_Esstisch_type room_Garderobe_floor room_Garderobe_id room_Garderobe_label room_Garderobe_type room_Kaminofen_floor room_Kaminofen_id room_Kaminofen_label room_Kaminofen_type room_Kueche_floor room_Kueche_id room_Kueche_label room_Kueche_type room_Kuechentuer_floor room_Kuechentuer_id room_Kuechentuer_label room_Kuechentuer_type room_Mittendrin_floor room_Mittendrin_id room_Mittendrin_label room_Mittendrin_type room_Sitzgruppe_floor room_Sitzgruppe_id room_Sitzgruppe_label room_Sitzgruppe_type room_Terrassentuer_floor room_Terrassentuer_id room_Terrassentuer_label room_Terrassentuer_type room_Testzone_floor room_Testzone_id room_Testzone_label room_Testzone_type room_VorSchrank_floor room_VorSchrank_id room_VorSchrank_label room_VorSchrank_type room_Wohnzimmer_floor room_Wohnzimmer_id room_Wohnzimmer_label room_Wohnzimmer_type startdir:north,west,south,east startx starty
webCmd CleanEG:pause:resume:dock
LG
pah
Frohes neues Jahr!
Zitat von: Prof. Dr. Peter Henning am 28 Dezember 2023, 17:05:49Klar geht das - und es sind auch keine Readings, sondern Attribute, genauer: User-Attribute userattr. Die verbinden benannte Zonen mit den Zonen-Identifiern aus dem Roomba.
Hier mal ein List eines meiner drei Roboter. Mit dem Befehl "set RoombaEmma CleanEG Sitzgruppe" schicke ich ihn gezielt zur Sitzgruppe
Internals:
CID xxxxxxxxxxxxx
DEF xxxxxxxxxxxxx
FUUID 60e322df-f33f-8771-a8d6-2b967edc3a8c6a7e
IODev RoombaEmmaClient
LASTInputDev RoombaEmmaClient
MSGCNT 1311
NAME RoombaEmma
NR 184
RoombaEmmaClient_MSGCNT 1311
RoombaEmmaClient_TIME 2023-12-26 13:39:08
STATE Charge (100 %), client disconnected
TYPE MQTT2_DEVICE
VERSION 1.3
eventCount 1388
READINGS:
2023-12-24 21:08:04 IODev RoombaEmmaClient
2023-12-26 13:34:14 NumOfSchedules 0
2023-12-26 13:34:14 audioVolume 100
2023-12-26 13:34:14 battery 100
2023-12-26 13:39:01 bbrEvacs 0
2023-12-26 13:39:01 bbrTime :
2023-12-26 13:39:01 bbrTime2 0d 0h m
2023-12-26 13:34:14 cmBinFull false
2023-12-26 13:39:01 cmCycle none
2023-12-26 13:39:01 cmError None
2023-12-26 13:39:01 cmErrorD Kein Fehler
2023-12-26 13:39:01 cmExpire Never
2023-12-26 13:39:01 cmInitiator localApp
2023-12-26 13:39:01 cmNotReady false
2023-12-26 13:39:01 cmPhase charge
2023-12-26 13:39:01 cmPhaseD Ladung
2023-12-26 13:39:01 cmPhaseE Charge
2023-12-26 13:39:01 cmTime 0 min
2023-12-26 13:38:56 dockKnown true
2023-12-26 13:34:14 lastCommand start
2023-12-26 13:34:14 lastCommandInitiator localApp
2023-12-26 13:39:15 mqttclient disconnected
2023-12-26 13:34:14 sBinPause true
2023-12-26 13:34:14 sCarpetBoost false
2023-12-26 13:34:14 sNoAutoPasses true
2023-12-26 13:34:14 sOpenOnly true
2023-12-26 13:34:14 sSchedHold false
2023-12-26 13:34:14 sTwoPass false
2023-12-26 13:34:14 sVacHigh false
2023-12-26 13:34:14 signalAP FritzRepeater3000
2023-12-26 13:34:14 signalBssid 0c:72:74:aa:d6:46
2023-12-26 13:39:08 signalRSSI -55
2023-12-26 13:34:13 state CleanEG
helper:
Attributes:
IODev RoombaEmmaClient
SVG_collect SVG_RoombaEmma.xml
SVG_color1 green:lightgreen
SVG_color2 orange:yellow
SVG_color3 red:pink
SVG_color4 blue:lightblue
SVG_final SVG_RoombaEmma.svg
SVG_room SVG_EG.svg
babbleName Staubsauger_1
devStateIcon Charge.*100.*:vacuum_red Charge.*9\d.*:vacuum_yellow_90 Charge.*8\d.*:vacuum_yellow_80 Charge.*7\d.*:vacuum_yellow_70 Charge.*6\d.*:vacuum_yellow_60 Charge.*5\d.*:vacuum_yellow_50 Charge.*4\d.*:vacuum_yellow_40 Charge.*3\d.*:vacuum_yellow_30 Charge.*2\d.*:vacuum_yellow_20 Charge.*1\d.*:vacuum_yellow_10 Mission.*100.*:vacuum_green_100 Mission.*9\d.*:vacuum_green_90 Mission.*8\d.*:vacuum_green_80 Mission.*7\d.*:vacuum_green_70 Mission.*6\d.*:vacuum_green_60 Mission.*5\d.*:vacuum_green_50 Mission.*4\d.*:vacuum_green_40 Mission.*3\d.*:vacuum_green_30 Mission.*2\d.*:vacuum_green_20 Mission.*1\d.*:vacuum_green_10
devicetopic yyyyyyyyyyyy
floor_Erdgeschoss_label Erdgeschoss
floor_Erdgeschoss_pMapId zzzzzzzzz
floor_Erdgeschoss_userPmapvId 221106T121339
group Staubsaugen
noMap true
readingList $DEVICETOPIC:.* {roomba::reading($NAME,$EVENT)}
room Kontrollraum
room_Erdgeschoss_floor Terrassentür
room_Erdgeschoss_id 3
room_Erdgeschoss_label Erdgeschoss
room_Esstisch_floor Erdgeschoss
room_Esstisch_id 0
room_Esstisch_label Esstisch
room_Esstisch_type zid
room_Garderobe_floor Erdgeschoss
room_Garderobe_id 4
room_Garderobe_label Garderobe
room_Garderobe_type rid
room_Kaminofen_floor Erdgeschoss
room_Kaminofen_id 4
room_Kaminofen_label Kaminofen
room_Kaminofen_type zid
room_Kueche_floor Erdgeschoss
room_Kueche_id 3
room_Kueche_label Küche
room_Kueche_type rid
room_Kuechentuer_floor Erdgeschoss
room_Kuechentuer_id 5
room_Kuechentuer_label Kuechentuer
room_Kuechentuer_type zid
room_Mittendrin_floor Erdgeschoss
room_Mittendrin_id 6
room_Mittendrin_label Mittendrin
room_Mittendrin_type zid
room_Sitzgruppe_floor Erdgeschoss
room_Sitzgruppe_id 1
room_Sitzgruppe_label Sitzgruppe
room_Sitzgruppe_type zid
room_Terrassentuer_floor Erdgeschoss
room_Terrassentuer_id 3
room_Terrassentuer_label Terrassentuer
room_Terrassentuer_type zid
room_VorSchrank_floor Erdgeschoss
room_VorSchrank_id 2
room_VorSchrank_label VorSchrank
room_VorSchrank_type zid
room_Wohnzimmer_floor Erdgeschoss
room_Wohnzimmer_id 1
room_Wohnzimmer_label Wohnzimmer
room_Wohnzimmer_type rid
setList start:noArg {roomba::command($NAME,"start",$EVENT)}
stop:noArg {roomba::command($NAME,"stop",$EVENT)}
dock:noArg {roomba::command($NAME,"dock",$EVENT)}
resume:noArg {roomba::command($NAME,"resume",$EVENT)}
pause:noArg {roomba::command($NAME,"pause",$EVENT)}
Allow:true,false {roomba::allow()}
CarpetBoost:true,false {roomba::setting($NAME,"carpetBoost",$EVENT)}
TwoPass:true,false {roomba::setting($NAME,"twoPass",$EVENT)}
NoAutoPasses:true,false {roomba::setting($NAME,"noAutoPasses",$EVENT)}
NoPP:true,false {roomba::setting($NAME,"noPP",$EVENT)}
VacHigh:true,false {roomba::setting($NAME,"vacHigh",$EVENT)}
BinPause:true,false {roomba::setting($NAME,"binPause",$EVENT)}
OpenOnly:true,false {roomba::setting($NAME,"openOnly",$EVENT)}
ProgHold:true,false {roomba::setting($NAME,"schedHold",$EVENT)}
ProgSun:time {roomba::setsched2($NAME,0,$EVENT)}
ProgMon:time {roomba::setsched2($NAME,1,$EVENT)}
ProgTue:time {roomba::setsched2($NAME,2,$EVENT)}
ProgWed:time {roomba::setsched2($NAME,3,$EVENT)}
ProgThu:time {roomba::setsched2($NAME,4,$EVENT)}
ProgFri:time {roomba::setsched2($NAME,5,$EVENT)}
ProgSat:time {roomba::setsched2($NAME,6,$EVENT)}
maplist:noArg {roomba::listmaps($NAME)}
mapdel {roomba::delmap($NAME,$EVENT)}
SetScheduleAll:true,false {roomba::setsched2($NAME,"all",$EVENT)}
SetSchedule1:true,false {roomba::setsched2($NAME,"1",$EVENT)}
SetSchedule2:true,false {roomba::setsched2($NAME,"2",$EVENT)}
CreateFloor {roomba::createFloor($NAME,$EVENT)}
CreateRoom {roomba::createRoom($NAME,$EVENT)}
CleanEG:Sitzgruppe,Kaminofen,Terrassentuer,VorSchrank,Mittendrin,Esstisch,Kuechentuer,Kueche,Garderobe,Wohnzimmer {roomba::cleanRoom($NAME,"Erdgeschoss",$EVENT)}
startdir north
startx 1080
starty 500
stateFormat cmPhaseE (battery %), client mqttclient
userReadings signalAP:.*signalBssid.* {my $bssid=ReadingsVal('RoombaEmma','signalBssid','');;(($bssid=~/44.*20/)?'FritzBox':(($bssid=~/e8.*0f/)?'FritzRepeater1750':'FritzRepeater3000'))}, mqttclient:.* {Value("RoombaEmmaClient")}
userattr LOG_dir SVG_collect SVG_color1 SVG_color2 SVG_color3 SVG_color4 SVG_dir SVG_final SVG_room debug floor_Erdgeschoss_label floor_Erdgeschoss_pMapId floor_Erdgeschoss_userPmapvId noMap:true,false room_Erdgeschoss_floor room_Erdgeschoss_id room_Erdgeschoss_label room_Erdgeschoss_type room_Esstisch_floor room_Esstisch_id room_Esstisch_label room_Esstisch_type room_Garderobe_floor room_Garderobe_id room_Garderobe_label room_Garderobe_type room_Kaminofen_floor room_Kaminofen_id room_Kaminofen_label room_Kaminofen_type room_Kueche_floor room_Kueche_id room_Kueche_label room_Kueche_type room_Kuechentuer_floor room_Kuechentuer_id room_Kuechentuer_label room_Kuechentuer_type room_Mittendrin_floor room_Mittendrin_id room_Mittendrin_label room_Mittendrin_type room_Sitzgruppe_floor room_Sitzgruppe_id room_Sitzgruppe_label room_Sitzgruppe_type room_Terrassentuer_floor room_Terrassentuer_id room_Terrassentuer_label room_Terrassentuer_type room_Testzone_floor room_Testzone_id room_Testzone_label room_Testzone_type room_VorSchrank_floor room_VorSchrank_id room_VorSchrank_label room_VorSchrank_type room_Wohnzimmer_floor room_Wohnzimmer_id room_Wohnzimmer_label room_Wohnzimmer_type startdir:north,west,south,east startx starty
webCmd CleanEG:pause:resume:dock
Großartig! Das sieht genau nach dem aus, was ich gesucht habe. Wie komme ich an die pMapID und userPmapvId sowie die Ids und Types (zid = zoneID, rid = roomID?)? Muss ich dazu den Sauger einmal ins Netz lassen und über die App die jeweilige Zone/Raum reinigen lassen und mitlauschen, welche IDs da dann als Reading entstehen und mit welchen Werten befüllt werden?
Und rein interessehalber noch eine Frage: Welche Erkenntnisse lassen sich aus den signal*-Readings ziehen? Ist das der Accesspoint, über den das Gerät gerade im WLAN ist? Lässt sich aus dem AP und der Signalstärke etwas ableiten?
Viele Grüße
Christian
ZitatMuss ich dazu den Sauger einmal ins Netz lassen und über die App die jeweilige Zone/Raum reinigen lassen und mitlauschen, welche IDs da dann als Reading entstehen und mit welchen Werten befüllt werden?
Ja.
ZitatWelche Erkenntnisse lassen sich aus den signal*-Readings ziehen? Ist das der Accesspoint, über den das Gerät gerade im WLAN ist? Lässt sich aus dem AP und der Signalstärke etwas ableiten?
Keine. Ja. Nein.
LG
pah
Moin, Männers,
nachdem mein Roomba 960 für eine ganze Weile einigermaßen mit fhem lief, ist mir unlängst die fhem-Maschine abgeraucht (Karte gestorben) und ich habe das zum Anlass genommen, auf einen Rapsi 4 mit SSD umzusteigen.
Dabei auch das Debian modernisiert, neue IP, fhem zurückgespielt.
Es ging überraschend gut, aber der Roomba spielt nicht mehr mit.
Was ich bislang herausfinden konnte:
Ich habe den Roomba 960 auf Werkseinstellungen zurückgesetzt und mir aus dem Git die aktuelle Version von Dorita980 besorgt.
Damit konnte ich mit dem Roomba wohl grundsätzlich Verbindung aufnehmen, aber es scheitert dann irgendwo am Kleingedruckten bei SSL.
Ich vermute, dass das auch der Grund ist, warum der Connect des einschlägigen fhem-devices nicht klappt.
Im Log von fhem steht trotz Verbose 5 im MQTT-Device nichts spannendes:
2024.04.11 17:22:10 5: HttpUtils url=https://192.168.X.XX:8883/ NonBlocking via https
2024.04.11 17:22:10 4: IP: 192.168.X.XX -> 192.168.X.XX
Dorita 980 äußert sich bei getpassword wie folgt:
Robot Data:
{
ver: '3',
hostname: 'Roomba-TRALLALFIDIBUMM',
robotname: 'Heinzelmann',
ip: '192.168.X.XX',
mac: 'DC:F5:05:B9:77:A6',
sw: 'v2.4.17-138',
sku: 'R960040',
nc: 0,
proto: 'mqtt',
cap: {
pose: 1,
ota: 2,
multiPass: 2,
pp: 1,
binFullDetect: 1,
langOta: 1,
maps: 1,
edge: 1,
eco: 1,
svcConf: 1
},
blid: 'LUKEICHBINDEINVATER'
}
node:events:495
throw er; // Unhandled 'error' event
^
Error: 4014908C7F000000:error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled:../ssl/statem/extensions.c:893:
Emitted 'error' event on TLSSocket instance at:
at emitErrorNT (node:internal/streams/destroy:151:8)
at emitErrorCloseNT (node:internal/streams/destroy:116:3)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
library: 'SSL routines',
reason: 'unsafe legacy renegotiation disabled',
code: 'ERR_SSL_UNSAFE_LEGACY_RENEGOTIATION_DISABLED'
}
Das klingt mir so, als ob die Verbindung grundsätzlich klappt und die Maschine den Großteil ihres Status schon rausrückt, dann aber irgendwas am SSL zu meckern hat. Aber was?!?
Habt Ihr mir eventuell und bittebitte einen Tipp, wo ich als Kryptografie-Dummy da hin greifen muß?
Sahara-staubige Grüße aus Frankfurt,
Frank