Giter Club home page Giter Club logo

tsun-talent-monitoring's Introduction

TSUN / Talent Monitoring Connector

A Node.js project / Docker container that pulls data from the www.talent-monitoring.com cloud and converts it into a digestible JSON structure for consumption via HTTP/REST, a Prometheus endpoint for visualisation in Grafana and/or an MQTT Dispatcher for use with (mostly) your Home Assistant instance.

Motivation

When my tiny solar power plant arrived I realized I order the "wrong" inverter in terms of connectivity, instead of a far superior OpenDTU compatible unit, I ended up with a TSUN TSOL-MS600 + WIFI / M800(DE) EVO; which is not a bad performing inverter, just one with crappy connectivity. It sports a WiFi unit (with mediocre reception) and only uploads data in 5 minute intervals to some servers (at least in Frankfurt/Germany but who knows where this data is going to be replicated to...). The "App" that it comes with is pretty barebones and the website www.talent-monitoring.com is only a tad better. Also, the servers seem to crap out from time to time, which then also affects this software as well.

If you want to measure the power you produce accurately & in realtime, better get an outdoor or socket mounted smart switch with measuring capabilities. Still this will then only give you the amount of power you produce, other data like the actual power each panel produces or the temperature of the inverter can't really be measured by external solutions.

So, this piece of software aims to ease the pain a bit, enabling you to ditch the App & Website for now while fetching the data from the cloud & making it available locally via HTTP & MQTT (with Home Assistant autodiscovery).

Btw.: The code is spaghetti, I don't really have the intention to clean it up, it's more of an "I already spent enough time with it, works okay enough now" situation. Still, if you want to improve it, please feel free & send a PR :D But most importantly, this is just a "stopgap implementation" to me, as I'm currently working on a local proxy implementation that is able to capture the data before it will be send to the remote servers.

Data access & integrations

Home Assistant (MQTT)

Home Assistant can be fed with data using MQTT, it's automatic discovery is supported, so as soon as you've enabled MQTT (set the environment variable MQTT_ENABLED to true) and configured your broker, new devices should be available in your Home Assistant instance. You'll get one device for each inverter you sport, as well as an additional device for each of your solar panels.

In order to add the data to your energy dashboard, you have to generate a Riemann helper entity, based on the current power in Watts. The configuration of the helper entity is "Left Riemann sum" & a metric prefix of "kilo" with an "hourly" unit.

Note: After the first start of the container, the entities should be generated directly, but it can take up to 5 minutes for the first values to be displayed.

Prometheus / Grafana

If you set the environment variable PROMETHEUS_ENABLED to true, you get the data in a Prometheus / Grafana compatible format. It is available via the /metrics endpoint by default, which can be changed using the PROMETHEUS_ENDPOINT variable. You can also enable service metrics like CPU, RAM consumption of the software itself by setting the PROMETHEUS_INCLUDE_SERVICE to true, which is disabled by default.

The output of the endpoint should be similar to this:

# HELP inverter_active_power active power measured in Watt
# TYPE inverter_active_power gauge
inverter_active_power{serialno="$YourInverterSerial"} 5

# HELP inverter_daily_generation energy generated today measured in Wh
# TYPE inverter_daily_generation gauge
inverter_daily_generation{serialno="$YourInverterSerial"} 1430

# HELP inverter_monthly_generation energy generated this month measured in kWh
# TYPE inverter_monthly_generation gauge
inverter_monthly_generation{serialno="$YourInverterSerial"} 18.92

# HELP inverter_yearly_generation energy generated this year measured in kWh
# TYPE inverter_yearly_generation gauge
inverter_yearly_generation{serialno="$YourInverterSerial"} 217.92

# HELP inverter_temperature inverter temperature measured in degrees celsius
# TYPE inverter_temperature gauge
inverter_temperature{serialno="$YourInverterSerial"} 24

# HELP inverter_current grid current measured in Ampere
# TYPE inverter_current gauge
inverter_current{serialno="$YourInverterSerial"} 0.02

# HELP inverter_voltage grid voltage measured in Volt
# TYPE inverter_voltage gauge
inverter_voltage{serialno="$YourInverterSerial"} 233.7

# HELP inverter_frequency grid frequency measured in Hz
# TYPE inverter_frequency gauge
inverter_frequency{serialno="$YourInverterSerial"} 50

# HELP inverter_wifi_signal_strength inverter WiFi signal strength measured in %
# TYPE inverter_wifi_signal_strength gauge
inverter_wifi_signal_strength{serialno="$YourInverterSerial"} 40

# HELP panel_active_power solar panel active power measured in Watt
# TYPE panel_active_power gauge
panel_active_power{panelid="$YourInverterSerial_PV1"} 2.9
panel_active_power{panelid="$YourInverterSerial_PV2"} 2.4

# HELP panel_current solar panel current measured in Ampere
# TYPE panel_current gauge
panel_current{panelid="$YourInverterSerial_PV1"} 0.09
panel_current{panelid="$YourInverterSerial_PV2"} 0.07

# HELP panel_voltage solar panel voltage measured in Volt
# TYPE panel_voltage gauge
panel_voltage{panelid="$YourInverterSerial_PV1"} 29.6
panel_voltage{panelid="$YourInverterSerial_PV2"} 29.8

REST

If you set the environment variable REST_ENABLED to true, you get the data in a JSON format. It is available via the /power-station endpoint by default, which can be changed using the REST_ENDPOINT variable.

The data should be in this format, given you have 1 power station, 1 inverter & 2 solar panels. If you run more / less appliances, the output will of course vary depending on your installation.

[
  {
    "guid": "$YOUR_POWERSTATION_GUID",
    "online": true,
    "power": {
      "active": 5, // W
      "today": 1430, // Wh
      "month": 18.92, // kWh
      "year": 217.92 // kWh
    },
    "name": "$YOUR_POWERSTATION_NAME",
    "timestamp": "2023-08-17T18:28:03.000Z", // ISO 8601 date of the last successful communication with your power-station
    "numberOfPanels": 2,
    "numberOfInverters": 1,
    "wifiSignalStrength": 40, // %
    "inverters": [
      {
        "guid": "$YOUR_INVERTER_GUID",
        "online": true,
        "numberOfPanels": 2,
        "firmwareVersion": "$YOUR_INVERTER_FIRMWARE_VERSION",
        "ratedPower": 600, // W
        "serialNumber": "$YOUR_INVERTER_SERIAL",
        "model": "$YOUR_INVERTER_MODEL",
        "brand": "$YOUR_INVERTER_BRAND",
        "power": {
          "active": 5, // W
          "today": 1430, // Wh
          "month": 18.92, // kWh
          "year": 217.92 // kWh
        },
        "current": 0.02, // A
        "voltage": 233.7, // V
        "frequency": 50, // Hz
        "temperature": 24, // °C
        "panels": [
          {
            "id": "PV1",
            "current": 0.09, // A
            "power": 2.9, // W
            "voltage": 29.6 // V
          },
          {
            "id": "PV2",
            "current": 0.07, // A
            "power": 2.4, // W
            "voltage": 29.8 // V
          }
        ]
      }
    ]
  }
]

Deployment

Docker Compose

version: "3.9"
services:
  solarmonitor:
    container_name: "talent-monitoring"
    image: "asciidisco/talent-monitoring:2023.8"
    ports:
      - "3000:3000/tcp"
    restart: "unless-stopped"
    environment:
      TZ: "Europe/Berlin"
      API_USERNAME: "$YOUR_TALENT_MONITORING_COM_USERNAME"
      API_PASSWORD: "$YOUR_TALENT_MONITORING_COM_PASSWORD"
      REST_ENABLED: true
      PROMETHEUS_ENABLED: true
      MQTT_ENABLED: true
      MQTT_HOST: "$YOUR_MQTT_BROKER_HOST"
      MQTT_USERNAME: "$YOUR_MQTT_BROKER_USERNAME"
      MQTT_PASSWORD: "$YOUR_MQTT_BROKER_PASSWORD"
      DEVICE_PANEL_MANUFACTURER: "$YOUR_SOLAR_PANEL_MANUFACTURER"
      DEVICE_PANEL_MODEL: "$YOUR_SOLAR_PANEL_MODEL"
    healthcheck:
      test: curl --fail http://localhost:3000/health || exit 1
      interval: 60s
      retries: 5
      start_period: 20s
      timeout: 10s

Node.js

If you don't want to run this software in a docker container, you can always install Node.js on your system, git clone this repository npm install all the dependencies & npm start in order to run it on your host system, LXC container or VM. Just make sure all necessary environment variables are set.

Environment variables

Variable Required Description Default
TZ no Your local timezone Europe/Berlin
SERVER_PORT no Webserver port (If you change it make sure to adapt your docker vars) 3000
LOG_LEVEL no One of 'fatal', 'error', 'warn', 'info', 'debug', 'trace' or 'silent'. info
API_USERNAME yes Your talent-monitoring.com username -
API_PASSWORD yes Your talent-monitoring.com password -
REST_ENABLED no Enable / Disable the JSON REST endpoint false
REST_ENDPOINT no Changes the default data route /power-station
PROMETHEUS_ENABLED no Enable / Disable the Prometheus endpoint false
PROMETHEUS_ENDPOINT no Changes the default prometheus route /metrics
PROMETHEUS_INCLUDE_SERVICE no Enable / Disable the service metrics false
PROMETHEUS_INCLUDE_API no Enable / Disable the solar data metrics false
MQTT_HOST no Your MQTT host -
MQTT_USERNAME no Your MQTT username (if auth enabled) -
MQTT_PASSWORD no Your MQTT password (if auth enabled) -
MQTT_ENABLED no Enable / Disable the MQTT service false
MQTT_CLIENTID no Changes the MQTT client id talents2mqtt
MQTT_BASE_TOPIC no Changes the MQTT base topic talents2mqtt
MQTT_HOMEASSISTANT_DISCOVERY_PREFIX no Changes the Home Assistant MQTT Discovery Topic homeassistant
DEVICE_PANEL_MANUFACTURER no Add the manufacturer of your Solar Panels for display in HA unknown
DEVICE_PANEL_MODEL no Add the model of your Solar Panels for display in HA unknown

Issues & Questions

If you have any questions and or issue, or want to improve this, don't hesitate to reach out via GitHub Issues and/or create a Pull Request.

License

MIT License

Copyright (c) 2023 Sebastian Golasch

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

tsun-talent-monitoring's People

Contributors

beutebayer avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.