An open API service indexing awesome lists of open source software.

https://github.com/michaelherger/homeassistant-smartfox


https://github.com/michaelherger/homeassistant-smartfox

Last synced: 2 months ago
JSON representation

Awesome Lists containing this project

README

        

# Smartfox data extraction

Some random notes about findings in the [Smartfox](https://smartfox.at) web API, and how to integrate it into [Home Assistant](https://www.home-assistant.io).

Basic Smartfox Information

## Reading values

We can read some live data from the Smartfox on http://smartfox/values.xml:

```xml

a53ca932e4ab608af52a
....
192.168.000.232
EM2 00.01.08.07
0.51 kW
de
2024-07-07
13:33:32 Uhr
....
093.189.025.182
5001
0
Analog
0%
0.00 <span>kW</span>
0.0 °C
0
11
Analog
0
0
255
0
0
255
0
0
255
0
0
255
0
0
255
0
0
0
0
0
100
0
0
0
0
["","","","",""]





0
0
0
0
0
CC
CC
CC
CC
CC
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
[0,0,0,0,0]
[71582.78,71582.78,71582.78,71582.78,71582.78]
[38400,0,45,0,0]
[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
[0,0,0,0,0]
[0,0,0,0,0]
0
0.00
0.00
0.00
0.00
0.00
0
0
0
0
0
0
510 W
13105.722 kWh
3120 VAh
2495 Wh
0 Wh
0 W
20913.221 kWh
0.000 kWh
5239 Wh
1
0
0
0
566 min
0 min
0 min
65274 min
34 min
0 min
0 min
263 min
0.00 <span>kW</span>
0.00 kW
0.00 kWh
0.00 kW
0.0 °C
0.0 °C
0.00 kWh
0.0 °C
0
0
0
0
0
236 V
239 V
237 V
2.74 A
1.82 A
2.38 A
385 W
-376 W
501 W
3.98 kW
0.00 kW
0.00 kW
0.00 kW
0.00 kW
Plenticore




33455.23 kWh
0.00 kWh
0.00 kWh
0.00 kWh
0.00 kWh
0 kWh
0 kWh
0.0 °C
0 °C
0 °C
0 kWh
Aus
Nicht Aktiv
0.0 °C
asdf
0.00
kWh
0.00 kW
kWh
0.0 °C
0.0 °C
0.0 °C
0
0
0
AUS
0.0 %
0 °C
0
0 %
OUTP_NO_CTRL
0
0.00 kW
0 mA
0 mA
0 mA
0
0 s
0 s
0 s
0
0
0
0
0
0
0
0
0
0
0
0.0 °C
0.0 °C
0 V
0
0.0 %
0
[[0,0,0]]
0
0
-1
-1
-1
-1
-1
6
0
0
0
0
9
0
0
0
0
0
0
0
0
0
0.00 <span>kW</span>
0.00 <span>kW</span>
0.00 <span>kW</span>
0.00 <span>kW</span>
0.00 <span>kW</span>
0.00 kWh
0.00 kWh
0.00 kWh
0.00 kWh
0.00 kWh
0
0
1509442

32767
0
0
0
0
0
0
1
1
14268
0
0
0
1
0
0
0
Boiler
Relais
Relais
Trockner
2
0
0
2
2
9
9
0
566 min
0 min
0 min
65274 min
0
0
0
0
1
0
0
1
1
0
0
0
device_heizstab
device_verbraucher_allg
device_verbraucher_allg
device_verbraucher_allg
3.98 kW
510 W
-1%
-1%
0.00 kW
0 °C
Plenticore
EIN
AUS
AUS
AUS
3
5239
2495
0
8957
0
0
0
0
0
0
0
0
0
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0
0
0
0
0
[[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0],[0.0,0.0,0.0]]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
EM
EM
EM
EM
EM
0.00 kW
0.00 kW
0.00 kW
0.00 kW
0.00 kW
0
0
0.00

nan

0
firstPrio: 0

lastPrio: 0

powerScope: 0

currentScope: 0

prioMaxValue: 0, 0, 0, 0, 0, 0

prioMinValue: 0, 0, 0, 0, 0, 0

prioCounters: 0, 0, 0, 0, 0, 0

VB
0%
0.0%
0.0%
0.00 <span>kW</span>
0
0.0°C
2
0
0
0
0
1
VB

0
0
0
00:00
0
0
0
0
0
0
359
0
192.168.000.231
71
000.000.000.000
255
000.000.000.000
255
000.000.000.000
255
000.000.000.000
255
VB
000.000.000.000
40
EM
000.168.000.040
1
EM
000.000.000.000
1
EM
000.168.000.040
1
EM
000.000.000.000
1
EM
000.000.000.000
1
192.168.001.190
192.168.001.210
0
000.000.000.000
0
000.000.000.000
0
000.000.000.000
0
000.000.000.000
0
[]

```

## Calculation of some values

### Live data

```javascript
var e = hiddenValues.hidProduction;
e = e.replace(',', ''),
e = Number(e.replace(' kW', '')) / 100,
e += serverInfoPvPower;
var t = hiddenValues.hidPower;
t = Number(t.replace(' W', '')) / 1e3;
var n,
d = hiddenValues.battery1Power;
d = d.replace(',', '');
var o;
o = (d = Number(d.replace(' kW', '')) / 100) > 0,
(n = e + t - d) < 0 && (n = 0),
document.getElementById('lineProductionColor').style.display = 'none',
document.getElementById('lineProductionGray').style.display = 'none',
document.getElementById('productionFlowItem').hidden = !0,
document.getElementById('lineConsumptionColor').style.display = 'none',
document.getElementById('lineConsumptionGray').style.display = 'none',
document.getElementById('consumptionFlowItem').hidden = !0,
document.getElementById('lineGridBlue').style.display = 'none',
document.getElementById('fromGridFlowItem').hidden = !0,
document.getElementById('lineGridRed').style.display = 'none',
document.getElementById('toGridFlowItem').hidden = !0,
e > 0 ? (document.getElementById('lineProductionColor').style.display = '', document.getElementById('productionFlowItem').hidden = !1, wasProduction || restartAnimation('productionFlowItem'), wasProduction = !0) : (document.getElementById('lineProductionGray').style.display = '', wasProduction = !1),
checkIfSmartfoxConsumes() ? (document.getElementById('lineConsumptionColor').style.display = '', document.getElementById('consumptionFlowItem').hidden = !1, wasConsumption || restartAnimation('consumptionFlowItem'), wasConsumption = !0) : (document.getElementById('lineConsumptionGray').style.display = '', wasConsumption = !1),
document.getElementById('lineBatteryBrown').style.display = 'none',
document.getElementById('lineBatteryGray').style.display = '',
document.getElementById('batteryChargeFlowItem').hidden = !0,
document.getElementById('batteryDischargeFlowItem').hidden = !0,
document.getElementById('batteryCircle').classList.add('inactive');
var i = document.getElementById('batteryStatusText'),
r = Number(hiddenValues.hidWithBattery);
0 != d && '' != d && 1 == r ? o ? (i.innerHTML = translate('charging'), document.getElementById('batteryChargeFlowItem').hidden = !1, document.getElementById('batteryDischargeFlowItem').hidden = !0, document.getElementById('lineBatteryBrown').style.display = '', document.getElementById('lineBatteryGray').style.display = 'none', document.getElementById('batteryCircle').classList.remove('inactive')) : (i.innerHTML = translate('discharging'), document.getElementById('batteryChargeFlowItem').hidden = !0, document.getElementById('batteryDischargeFlowItem').hidden = !1, document.getElementById('lineBatteryBrown').style.display = '', document.getElementById('lineBatteryGray').style.display = 'none', document.getElementById('batteryCircle').classList.remove('inactive')) : i.innerHTML = '',
t >= 0 ? (document.getElementById('lineGridBlue').style.display = '', document.getElementById('fromGridFlowItem').hidden = !1, wasfromGrid || restartAnimation('fromGridFlowItem'), wasfromGrid = !0, wasToGrid = !1) : (document.getElementById('lineGridRed').style.display = '', document.getElementById('toGridFlowItem').hidden = !1, wasToGrid || restartAnimation('toGridFlowItem'), wasToGrid = !0, wasfromGrid = !1);
var m = 0,
l = 100;
e > 0 && (m = 100, l = Math.round(n / e * 100)),
n > 0 || (l = 0),
l > 100 && (l = 100),
document.getElementById('productionValue').innerHTML = e.toFixed(2).replace('.', commaSign) + ' kW',
document.getElementById('consumptionValue').innerHTML = n.toFixed(2).replace('.', commaSign) + ' kW',
document.getElementById('consumptionPercentValue').innerHTML = l + '%',
document.getElementById('batteryPower').innerHTML = d.toFixed(2).replace('.', commaSign) + ' kW',
initExternalMeterValues(useLiveData),
document.getElementById('heatPumpEnergy').innerHTML = hiddenValues.wpEnergyValue,
t >= 0 ? (document.getElementById('powerText').innerHTML = translate('fromGrid'), document.getElementById('powerValue').innerHTML = t.toFixed(2).replace('.', commaSign) + ' kW', setPercentageGrid('blue')) : (document.getElementById('powerText').innerHTML = translate('toGrid'), document.getElementById('powerValue').innerHTML = (-1 * t).toFixed(2).replace('.', commaSign) + ' kW', setPercentageGrid('red')),
document.getElementById('productionCircle').classList.remove('noAnimation'),
document.getElementById('batteryCircle').classList.remove('noAnimation'),
document.getElementById('consumptionCircle').classList.remove('noAnimation'),
document.getElementById('gridCircle').classList.remove('noAnimation'),
document.getElementById('devicesContainer').classList.remove('noAnimation'),
setPercentageProduction(m),
setPercentageConsumption(l)
```

### Historical data

```javascript
var e = Number(hiddenValues.hidWr1EnergyDay) / 1e3;
e += Number(hiddenValues.hidWr2EnergyDay) / 1e3,
e += Number(hiddenValues.hidWr3EnergyDay) / 1e3,
e += Number(hiddenValues.hidWr4EnergyDay) / 1e3,
e += Number(hiddenValues.hidWr5EnergyDay) / 1e3;
var t = Number(hiddenValues.hidFromGridEnergyDay) / 1e3,
a = Number(hiddenValues.hidToGridEnergyDay) / 1e3,
n = Number(hiddenValues.hidAoutEnergyDay) / 1e3,
o = t - a + e;
o < 0 && (o = 0);
var s = Math.round(o / e * 100);
s > 100 && (s = 100),
isNaN(s) && (s = 0),
document.getElementById('consumptionValue').innerHTML = (o.toFixed(2) + ' kWh').replaceAll('.', commaSign),
document.getElementById('consumptionPercentValue').innerHTML = s + '%',
document.getElementById('powerValue').innerHTML = (t.toFixed(1) + ' | ' + a.toFixed(1)).replaceAll('.', commaSign),
document.getElementById('powerText').innerHTML = 'Bezug | Lieferung',
document.getElementById('productionValue').innerHTML = (e.toFixed(2) + ' kWh').replaceAll('.', commaSign),
document.getElementById('batteryPower').innerHTML = '--',
document.getElementById('batteryStatusText').innerHTML = '--',
document.getElementById('analogOutPower').innerHTML = (n.toFixed(2) + ' kWh').replaceAll('.', commaSign),
document.getElementById('cc1Power').innerHTML = hiddenValues.hidCc1EnergyDay + ' kWh',
document.getElementById('cc2Power').innerHTML = hiddenValues.hidCc2EnergyDay + ' kWh',
document.getElementById('cc3Power').innerHTML = hiddenValues.hidCc3EnergyDay + ' kWh',
document.getElementById('cc4Power').innerHTML = hiddenValues.hidCc4EnergyDay + ' kWh',
document.getElementById('cc5Power').innerHTML = hiddenValues.hidCc5EnergyDay + ' kWh',
document.getElementById('heatPumpPower').innerHTML = hiddenValues.hidWpElEnergyDay + ' kWh',
document.getElementById('wr1EnergyValue').innerHTML = (Number(hiddenValues.hidWr1EnergyDay) / 1e3).toFixed(2) + ' kWh',
document.getElementById('wr2EnergyValue').innerHTML = (Number(hiddenValues.hidWr2EnergyDay) / 1e3).toFixed(2) + ' kWh',
document.getElementById('wr3EnergyValue').innerHTML = (Number(hiddenValues.hidWr3EnergyDay) / 1e3).toFixed(2) + ' kWh',
document.getElementById('wr4EnergyValue').innerHTML = (Number(hiddenValues.hidWr4EnergyDay) / 1e3).toFixed(2) + ' kWh',
document.getElementById('wr5EnergyValue').innerHTML = (Number(hiddenValues.hidWr5EnergyDay) / 1e3).toFixed(2) + ' kWh',
document.getElementById('consumptionControl1Power').innerHTML = (Number(hiddenValues.consumptionControl1EnergyDay) / 1e3).toFixed(2) + ' kWh',
initExternalMeterValues(useLiveData),
document.getElementById('s0InputValue').innerHTML = hiddenValues.hidS0InputDayPulses + ' kWh',
document.getElementById('productionCircle').classList.add('noAnimation'),
document.getElementById('batteryCircle').classList.add('noAnimation'),
document.getElementById('batteryCircle').classList.remove('inactive'),
document.getElementById('batteryCircle').classList.add('active'),
document.getElementById('consumptionCircle').classList.add('noAnimation'),
document.getElementById('gridCircle').classList.add('noAnimation'),
document.getElementById('devicesContainer').classList.add('noAnimation'),
document.getElementById('lineProductionColor').style.display = '',
document.getElementById('lineProductionGray').style.display = 'none',
document.getElementById('lineConsumptionColor').style.display = 'none',
document.getElementById('lineConsumptionGray').style.display = '',
o > 0 && (document.getElementById('lineConsumptionColor').style.display = '', document.getElementById('lineConsumptionGray').style.display = 'none'),
t > a ? (document.getElementById('lineGridBlue').style.display = '', document.getElementById('lineGridRed').style.display = 'none', setPercentageGrid('blue')) : (document.getElementById('lineGridBlue').style.display = 'none', document.getElementById('lineGridRed').style.display = '', setPercentageGrid('red')),
document.getElementById('lineBatteryBrown').style.display = '',
document.getElementById('lineBatteryGray').style.display = 'none',
document.getElementById('batteryChargeFlowItem').hidden = !0,
document.getElementById('batteryDischargeFlowItem').hidden = !0,
document.getElementById('fromGridFlowItem').hidden = !0,
document.getElementById('toGridFlowItem').hidden = !0,
document.getElementById('productionFlowItem').hidden = !0,
document.getElementById('consumptionFlowItem').hidden = !0,
hideModal('loadingModal'),
setPercentageProduction(100),
setPercentageConsumption(s)
```