Venin Skrevet 27. mars 2018 Skrevet 27. mars 2018 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(). Siter
Anbefalte innlegg
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.