fix_meter_values.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import os, sqlite3
  2. if os.name != 'nt':
  3. fn = '/opt/domoticz/userdata/domoticz.db'
  4. else:
  5. fn = 't:/domoticz.db'
  6. conn = sqlite3.connect(fn)
  7. cursor = conn.cursor()
  8. print("Successfully Connected to %s" % fn)
  9. sql = '''select DeviceRowId, Value, Counter, Date
  10. from Meter_Calendar order by DeviceRowId, Date'''
  11. cursor.execute(sql)
  12. rs = list(cursor.fetchall())
  13. for i, (DeviceRowId, Value, Counter, Date) in enumerate(rs):
  14. if i > 0 and i+2 < len(rs):
  15. DeviceRowId1, Value1, Counter1, Date1 = rs[i+1]
  16. DeviceRowId2, Value2, Counter2, Date2 = rs[i+2]
  17. if Value == 0 or Value1 == 0 or Value2 == 0:
  18. # these rows dont look sane, ignore
  19. continue
  20. bad_value = False
  21. if (DeviceRowId, DeviceRowId) == (DeviceRowId1, DeviceRowId2):
  22. # if the next two values are smaller but increasing
  23. if Counter > Counter1 and Counter > Counter2 and Counter1 < Counter2:
  24. bad_value = True
  25. if bad_value:
  26. DeviceRowId0, Value0, Counter0, Date0 = rs[i-1]
  27. if DeviceRowId == DeviceRowId0:
  28. new_counter = Counter1 - Value1
  29. new_value = new_counter - Counter0
  30. if new_value > 0:
  31. print('fix device %s at %s: from %s to %s (%s)' % (DeviceRowId, Date, Counter, new_counter, new_value))
  32. sql = '''update Meter_Calendar set value = %s, counter = %s
  33. where DeviceRowId = %s and Date = '%s' '''
  34. cursor.execute(sql % (new_value, new_counter, DeviceRowId, Date))
  35. conn.commit()
  36. cursor.close()