I don't have the skills to make this a plugin, but if called from a schedule this script can be used to pull real time data from the Emporia Cue 16 circuit mower monitor that I bought to replace a much more expensive sites age unit. It does use a free java implementation from a third party user on GitHub
https://github.com/helgew/emporia-downloader to download data from the Emporia cloud service because the company will not allow local access to the unit, but (at least for the moment) accessing the data is free. There is also a python library version of this downloader available, but I had already almost finished the java version before I found it. It will read the previous minute's data from all 16 channels and save it into Indigo variables that can be used to drive triggers, which I use primarily to know when the washer and dryer have finished... Sorry too add it in the body, but its short and for some reason it will not let me attach it.
- Code: Select all
import os, shutil, datetime, time, subprocess
from time import strftime
from datetime import datetime, timedelta
import requests
from requests.auth import HTTPDigestAuth
from ast import literal_eval
#execute the data Downloader saving data to file rather than PIPE that might overflow buffer
p=subprocess.Popen('java -jar ~/documents/emporiadownloader/emporia-downloader.1.2.jar --username EMAIL --password PASSWORD --raw --scale m --disable-influx=true --history 1m --sleep 0 --quiet --logfile ~/documents/emporiadownloader/emporialog.txt >~/documents/emporiadownloader/emporiadata.json', shell=True)
p.wait()
# Read data from file
with open('~/documents/emporiadownloader/emporiadata.json', 'r') as infile:
lines = infile.readlines()
# Convert the string representation of the data to individual dicts and get rid of any "null"s.
new_lines = [literal_eval(line.replace('null,null', '-1.0')) for line in lines]
# Combine into a single dict (optional)
line_dict = {}
x = 1
#Copy the data to the appropriate variables
for line in new_lines:
line_dict[x] = line
#if no data for channel keep prior value
if line_dict[x]["usageList"][0] < 0 :
continue
#Convert total KWH for prior minute into average watts as a string
Power = str(round(line_dict[x]["usageList"][0]*60000))
#Load Power into the appropriate variable
if line_dict[x]["channel"] == "1" :
#AC1
indigo.variable.updateValue(1205466672, value = Power)
if line_dict[x]["channel"] == "2" :
#Fan1
indigo.variable.updateValue(625300994, value = Power)
if line_dict[x]["channel"] == "3" :
#fan 2
indigo.variable.updateValue(204858724, value = Power)
if line_dict[x]["channel"] == "4" :
#AC2
indigo.variable.updateValue(366529428, value = Power)
if line_dict[x]["channel"] == "5" :
#Stove
indigo.variable.updateValue(1510404434, value = Power)
if line_dict[x]["channel"] == "6" :
#Hot Water Heater
indigo.variable.updateValue(1585403834, value = Power)
if line_dict[x]["channel"] == "7" :
#Dryer
indigo.variable.updateValue(1755332382, value = Power)
if line_dict[x]["channel"] == "8" :
#Septic
indigo.variable.updateValue(1680593288, value = Power)
if line_dict[x]["channel"] == "9" :
#Living Room
indigo.variable.updateValue(1097926420, value = Power)
if line_dict[x]["channel"] == "10" :
#Master 1
indigo.variable.updateValue(1173427536, value = Power)
if line_dict[x]["channel"] == "11" :
#Master 2
indigo.variable.updateValue(1811108695, value = Power)
if line_dict[x]["channel"] == "12" :
#Washer
indigo.variable.updateValue(1176479276, value = Power)
if line_dict[x]["channel"] == "13" :
#Server
indigo.variable.updateValue(1096942489, value = Power)
if line_dict[x]["channel"] == "14" :
#Server
indigo.variable.updateValue(1911961433, value = Power)
if line_dict[x]["channel"] == "15" :
#Jeff
indigo.variable.updateValue(1670122551, value = Power)
if line_dict[x]["channel"] == "16" :
#Server
indigo.variable.updateValue(1252297191, value = Power)
x += 1