2023-02-20 17:42:40 +01:00
|
|
|
# Shelly Plug
|
|
|
|
|
2023-02-27 16:22:59 +01:00
|
|
|
Shelly Plugs are quite cheap but relatively accurate to measure power consumptions less than 2.5 kW.
|
|
|
|
|
|
|
|
## Flash Tasmota
|
|
|
|
|
2023-02-27 17:04:05 +01:00
|
|
|
There's an OpenSource project to flash Tasmota on Shelly Plugs: [mg2x](https://github.com/arendst/mgos-to-tasmota)
|
2023-02-27 16:22:59 +01:00
|
|
|
|
2023-02-27 17:04:05 +01:00
|
|
|
Locate your Shellie's IP adress (in my case: 192.168.2.150) and update it "over the air" with the Tasmota firmware:
|
2023-02-27 16:22:59 +01:00
|
|
|
|
|
|
|
http://192.168.2.150/ota?url=http://ota.tasmota.com/tasmota/shelly/mg2tasmota-ShellyPlugS.zip
|
|
|
|
|
2023-02-27 17:04:05 +01:00
|
|
|
Your shelly will return a JSON object that looks like that:
|
2023-02-27 16:22:59 +01:00
|
|
|
|
|
|
|
```
|
|
|
|
{
|
|
|
|
"status": "updating",
|
|
|
|
"has_update": false,
|
|
|
|
"new_version": "20230109-114426/v1.12.2-g32055ee",
|
|
|
|
"old_version": "20230109-114426/v1.12.2-g32055ee"
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2023-02-27 17:01:27 +01:00
|
|
|
After a while your Shelly Plug S should be flashed with Tasmota firmware.
|
2023-02-27 16:22:59 +01:00
|
|
|
|
2023-02-27 17:01:27 +01:00
|
|
|
> Just be patient. This took longer than five minutes in my DSL connected network.
|
|
|
|
|
2023-02-27 17:04:05 +01:00
|
|
|
The Shelly Plus S will create create a new Wifi.
|
2023-02-27 17:01:27 +01:00
|
|
|
|
|
|
|
![Tasmota Wifi](./docs/images/wifi.png)
|
|
|
|
|
|
|
|
Join that Wifi and [configure the device)(http://192.164.4.1/).
|
|
|
|
|
|
|
|
![Join Wifi](./docs/images/configure-wifi.png)
|
|
|
|
|
2023-02-27 17:04:05 +01:00
|
|
|
You can configure it as a BlitzWolf SHP product.
|
2023-02-27 17:01:27 +01:00
|
|
|
|
|
|
|
Then it offers you power measurement and a programmable toogle.
|
|
|
|
|
|
|
|
![BlitzWolf](./docs/images/blitzwolf.png)
|
2023-02-27 16:22:59 +01:00
|
|
|
|
|
|
|
It should be configurable just like our [plant monitor](../plant-monitor/README.md).
|
2023-02-27 17:01:27 +01:00
|
|
|
|
|
|
|
Just enable MQTT and enter a shorter telemetry period.
|
|
|
|
|
|
|
|
![MQTT](./docs/images/mqtt.png) ![Telemetry period](./docs/images/telemetry-period.png)
|
|
|
|
|
|
|
|
It will post MQTT messages unter a topic `tele/tasmota_891E97/SENSOR` like this one:
|
|
|
|
|
|
|
|
```
|
|
|
|
{
|
|
|
|
"Time": "2023-02-27T16:45:07",
|
|
|
|
"ENERGY": {
|
|
|
|
"TotalStartTime": "2023-02-27T16:33:06",
|
|
|
|
"Total": 0.004,
|
|
|
|
"Yesterday": 0,
|
|
|
|
"Today": 0.004,
|
|
|
|
"Period": 0,
|
|
|
|
"Power": 34,
|
|
|
|
"ApparentPower": 44,
|
|
|
|
"ReactivePower": 27,
|
|
|
|
"Factor": 0.79,
|
|
|
|
"Voltage": 253,
|
|
|
|
"Current": 0.172
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2023-02-27 17:04:05 +01:00
|
|
|
We now can consume this messages in Node-RED, store them in InfluxDB and build a dashboard in Grafana.
|
2023-02-27 17:01:27 +01:00
|
|
|
|
|
|
|
### InfluxDB Bucket
|
|
|
|
|
|
|
|
I created a bucket called `Shelly`in InfluxDB, so we can store the messages in this bucket.
|
|
|
|
|
|
|
|
### Node-RED
|
|
|
|
|
|
|
|
I create a usual flow in Node-RED. A MQTT node fetches the values.
|
|
|
|
|
|
|
|
![Node-RED](./docs/images/node-red.png)
|
|
|
|
|
2023-02-27 17:04:05 +01:00
|
|
|
The message is fed into a filter function to only store usefull information:
|
2023-02-27 17:01:27 +01:00
|
|
|
|
|
|
|
```
|
|
|
|
return {
|
|
|
|
payload: {
|
|
|
|
power: Number(msg.payload.ENERGY.Power),
|
|
|
|
volate: Number(msg.payload.ENERGY.Voltage),
|
|
|
|
current: Number(msg.payload.ENERGY.Current)
|
|
|
|
}
|
|
|
|
};
|
|
|
|
````
|
|
|
|
|
|
|
|
The `payload` will be stored in InfluxDB in the bucket "shelly".
|
|
|
|
|
|
|
|
### InfluxDB Data Explorer
|
|
|
|
|
|
|
|
In Influx DB Data Explorer you can query the stored data.
|
|
|
|
|
|
|
|
![Data Explorer](./docs/images/data-explorer.png)
|
|
|
|
|
2023-02-27 17:04:05 +01:00
|
|
|
The query created by Data Explorer looks like that:
|
2023-02-27 17:01:27 +01:00
|
|
|
|
|
|
|
```
|
|
|
|
from(bucket: "shelly")
|
|
|
|
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|
|
|
|
|> filter(fn: (r) => r["_measurement"] == "msg")
|
|
|
|
|> filter(fn: (r) => r["_field"] == "power" or r["_field"] == "volate" or r["_field"] == "current")
|
|
|
|
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|
|
|
|
|> yield(name: "mean")
|
|
|
|
```
|
|
|
|
|
|
|
|
### Grafana
|
|
|
|
|
|
|
|
Using this query you can crate a dashboard in Grafana.
|
|
|
|
|
|
|
|
![Grafana](./docs/images/grafana.png)
|