Søk i nettsamfunnet
Viser resultater for emneknaggene 'botvac'.
Fant 1 resultat
-
Det hender at min Neato Botvac Connected ikke returnerer til docken sin når den er ferdig. Jeg har derfor brukt det uoffisielle API-et pybotvac til å få Domoticz til å sende meg (og kona) pushvarsel via Pushbullet når dette skjer. Jeg bruker foreløpig IFTTT til å starte/stoppe roboten i Domoticz, men man kan også gjøre dette via pybotvac. Da er det bare å modifisere scriptet mitt litt. Steg 1: Last ned pybotvac fra https://github.com/stianaske/pybotvac og pakk opp pybotvac-mappa her: \Domoticz\scripts\python\pybotvac Steg 2: Lag et par virtuelle sensorer av typen "Text" via "Create Virtual Sensors" som vist her: https://www.domoticz.com/wiki/Hardware_Setup#Dummy_Hardware . Kall den ene for f.eks. Robot - Dockstatus og den andre for Robot - Status. Det er kun den første som brukes til å pushvarslingen. Steg 3: Opprett robot.py (eller robot.pyw i Windows for å slippe å se vindu som popper opp når scriptet kjører) i \Domoticz\scripts\python\. import requests from pybotvac import Robot #Do this first to get Robot info: #>>> from pybotvac import Account #>>> # List all robots associated with account #>>> for robot in Account('[email protected]', 'sample_password').robots: # print(robot) #Name: my_robot_name, Serial: OPS01234-0123456789AB, Secret: 0123456789ABCDEF0123456789ABCDEF, Traits: ['maps'] robotSerial = 'OPS01234-0123456789AB' #Replace this with the serial of your robot robotSecret = '0123456789ABCDEF0123456789ABCDEF' #Replace this with the secret of your robot robotName = 'Neato' #Replace this with the name of your robot hostname = 'http://10.0.0.100:8080' username = '' #Username for Domoticz - leave blank if not used password = '' #Password for Domoticz - leave blank if not used idxDockStatus = '100' #IDX of a dummy text device created in Domoticz idxSelectedFew = '101' #IDX of another dummy text device created in Domoticz response = '' try: robot = Robot(robotSerial, robotSecret, robotName) except requests.exceptions.HTTPError as e: robot = '' # Do the HTTP get request try: response = requests.get(hostname, verify=True) except requests.exceptions.RequestException as e: print('Status: Unable to communicate with Domoticz') print(e) exit() print('Status:', response.status_code, '-', 'Connection to Domoticz established') #Function that updates dummy text devices in Domoticz def updateValue(idx, value): url = hostname + '/json.htm?type=command¶m=udevice&idx=' url += idx + '&nvalue=0&svalue=' + value session = requests.Session() session.auth = (username, password) response = session.get(url) print('Status:', response.status_code, '-', 'Device', idx, 'updated in Domoticz') #A few selected elements of interest try: isCharging = robot.get_robot_state().json()['details']['isCharging'] isDocked = robot.get_robot_state().json()['details']['isDocked'] charge = robot.get_robot_state().json()['details']['charge'] dockHasBeenSeen = robot.get_robot_state().json()['details']['dockHasBeenSeen'] #Ugly error handling a few exceptions in robot.py when Robot is not responding except Exception: isCharging = "Error" isDocked = "Error" charge = "Error" dockHasBeenSeen = "Error" print('Charging: ', isCharging) print('Docked: ', isDocked) print('Charge: ', charge) print('Dock seen: ', dockHasBeenSeen) #state = robot.get_robot_state().json() #Example of state when vacuuming: {'version': 1, 'reqId': '1', 'result': 'ok', 'error': 'ui_alert_invalid', 'data': {}, 'state': 2, 'action': 1, 'cleaning': {'category': 2, 'mode': 2, 'modifier': 1, 'spotWidth': 0, 'spotHeight': 0}, 'details': {'isCharging': False, 'isDocked': False, 'isScheduleEnabled': True, 'dockHasBeenSeen': True, 'charge': 53}, 'availableCommands': {'start': False, 'stop': True, 'pause': True, 'resume': False, 'goToBase': False}, 'availableServices': {'houseCleaning': 'basic-1', 'spotCleaning': 'basic-1', 'manualCleaning': 'basic-1', 'schedule': 'basic-1', 'maps': 'basic-1'}, 'meta': {'modelName': 'BotVacConnected', 'firmware': '2.2.0'}} #Concatenating a string of several elements as text for Domoticz device selectedElements = 'Charging: ' + str(isCharging) + '; Charge: ' + str(charge) + '; Docked: ' + str(isDocked) + '; Dock seen: ' + str(dockHasBeenSeen) updateValue(idxDockStatus, str(isDocked)) #Updating device in Domoticz updateValue(idxSelectedFew, selectedElements) #Updating device in Domoticz Her må man først få tak i sin egen robots serial, secret og navn. Dette får man ved å kjøre følgende: from pybotvac import Account for robot in Account('[email protected]', 'dittpassord').robots: print(robot) Dette legges inn i robot.py bak robotSerial, robotSecret og robotName. I tillegg må hostname endres til Domoticz sin IP og port og eventuelle login/pass til Domoticz legges inn. Til slutt må man skrive inn device ID på begge de to virtuelle sensorene som ble opprettet i steg 2. I robot.py-eksemplet over er det noen få utvalgte verdier jeg ville ha. isCharging viser om roboten lader eller ikke, isDocked viser om den er i docken, charge viser batteristatus i prosent og dockHasBeenSeen viser om den har sett docken. I robot.py-eksempelet har jeg lagt inn hvilke verdier som kan hentes ut bak "#Example of state when vacuuming:". Disse kan man også se dersom man kjører robot.get_robot_state().json(). Steg 4: Lag en knapp i Domoticz som sjekker dockstatus. Switches - Manual Light/Switch - Hardware: Dummy. Kall den f.eks. Robot - Sjekk dockstatus. Steg 5: Opprett batch-filen pushbullet.bat i \Domoticz\scripts\batch\. Man kan egentlig bruke det innebygde varslingssystemet i Domoticz, men jeg laget en batch-fil for å kunne sende varsel til flere Pushbullet-kontoer. @echo off set api=lkuashfalkjfhaskljfhaskjlfshafkljashfkaj set api2=mnsdbgkjlshsiutiuaysdajskhtjnasfmnasmfn set title=%~1 set body=%~2 curl -u %api%: https://api.pushbullet.com/v2/pushes -d type=note -d title="%title%" -d body="%body%" curl -u %api2%: https://api.pushbullet.com/v2/pushes -d type=note -d title="%title%" -d body="%body%" Bytt ut api og api2 med API-keyen man får på pushbullet.com. Fjern linjen for api2 og den siste linjen dersom det kun skal sendes til én person. Steg 6: Lag følgende dzVents-script i Domoticz under Setup - More options - Events. Scriptet kjører python-scriptet robot.py og sjekker den virtuelle sensoren Robot - Dockstatus om roboten er i docken. Deretter sender det pushvarsel dersom roboten ikke er i docken. local switch = 'Robot - Sjekk dockstatus' local text_sensor = 'Robot - Dockstatus' local title = 'Robot dockstatus' local robot_path = 'C:\\Program Files (x86)\\Domoticz\\scripts\\python\\robot.pyw' local push_path = 'C:\\Program Files (x86)\\Domoticz\\scripts\\batch\\pushbullet.bat' return { on = { devices = { switch, text_sensor }, }, execute = function(dz, dev) if dev.name == switch and dev.state == 'On' then os.execute('"'..robot_path..'"') dev.switchOff() dz.log('Sjekker Robots dockstatus') elseif dev.name == text_sensor then if dz.devices(text_sensor).text == 'True' then dz.log('Robot er i docken') elseif dz.devices(text_sensor).text == 'False' then message = 'Robot er ikke i docken!' tit_msg = title..'"' .. ' "' ..message combined = '""'..push_path..'" "'..tit_msg..'""' dz.log('Robot er ikke i docken') os.execute(combined) else message = 'Oppnår ikke kontakt med Robot!' tit_msg = title..'"' .. ' "' ..message combined = '""'..push_path..'" "'..tit_msg..'""' dz.log('Oppnår ikke kontakt med Robot') os.execute(combined) end end end } Pass på å endre variablene i starten til å passe det du selv har laget. Steg 7: Trykk på Robot - Sjekk dockstatus i Domoticz og de to virtuelle sensorene vil oppdateres. Du vil også få varsel om roboten ikke svarer eller ikke er i docken. Deretter legger du inn på knappen under TIMERS at den skal kjøres hver dag f.eks. klokka 20:00. Scriptet henter som sagt bare ut info fra roboten (via get_robot_state()) fordi jeg bruker IFTTT ellers, men kan med små tilpasninger også brukes til å styre den. På githuben til pybotvac (https://github.com/stianaske/pybotvac) står det noen kommandoer som kan brukes: start_cleaning(), pause_cleaning(), stop_cleaning(), send_to_base(), enable_schedule(), disable_schedule(), get_schedule().