Roomba Staubsaugerroboter

Begonnen von Prof. Dr. Peter Henning, 10 September 2020, 16:40:34

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

#255
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

marboj

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
meine FHEM-Konfiguration: Raspberry Pi4, BT-Dongle, CUL868, CeeBee II

gestein

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

gestein

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

Beta-User

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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

hapege

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
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

gestein

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

Was steht denn bei Dir in den Zeilen 326 und 332?
#326    mission($name,\%mission,\%ret);
#332    schedule(\%cleans,\%ret);


lg, Gerhard

hapege

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
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

Prof. Dr. Peter Henning

@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


hapege

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
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

Prof. Dr. Peter Henning

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

hapege

#266
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...)
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

gestein

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

hapege

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
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

gestein

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