{"id":14963533,"url":"https://github.com/svrooij/smartmeter2mqtt","last_synced_at":"2025-04-09T22:42:18.730Z","repository":{"id":39969472,"uuid":"186688833","full_name":"svrooij/smartmeter2mqtt","owner":"svrooij","description":"Publish data from your Smart meter with a P1 interface to you MQTT server.","archived":false,"fork":false,"pushed_at":"2025-03-11T20:16:49.000Z","size":3609,"stargazers_count":32,"open_issues_count":14,"forks_count":10,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-03T17:12:48.681Z","etag":null,"topics":["hacktoberfest","home-assistant","mqtt","p1-cable","p1-reader","smartmeter"],"latest_commit_sha":null,"homepage":"http://smartmeter2mqtt.svrooij.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/svrooij.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"svrooij"}},"created_at":"2019-05-14T19:42:06.000Z","updated_at":"2025-01-23T18:01:00.000Z","dependencies_parsed_at":"2023-12-31T05:36:31.198Z","dependency_job_id":"fdfa3e93-bb51-4561-b0e3-fc99b27aed00","html_url":"https://github.com/svrooij/smartmeter2mqtt","commit_stats":{"total_commits":52,"total_committers":5,"mean_commits":10.4,"dds":"0.23076923076923073","last_synced_commit":"022134797a1ba273f7fd28821f8baa8ad1de1713"},"previous_names":[],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svrooij%2Fsmartmeter2mqtt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svrooij%2Fsmartmeter2mqtt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svrooij%2Fsmartmeter2mqtt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/svrooij%2Fsmartmeter2mqtt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/svrooij","download_url":"https://codeload.github.com/svrooij/smartmeter2mqtt/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247640459,"owners_count":20971556,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest","home-assistant","mqtt","p1-cable","p1-reader","smartmeter"],"created_at":"2024-09-24T13:31:45.038Z","updated_at":"2025-04-09T22:42:18.702Z","avatar_url":"https://github.com/svrooij.png","language":"TypeScript","funding_links":["https://github.com/sponsors/svrooij"],"categories":[],"sub_categories":[],"readme":"# Smartmeter2mqtt\n\n[![npm](https://img.shields.io/npm/v/smartmeter2mqtt.svg?style=flat-square)](https://www.npmjs.com/package/smartmeter2mqtt)\n[![docker pulls][badge_docker]][link_docker]\n[![Support me on Github][badge_sponsor]][link_sponsor]\n[![Run build and publish][badge_build]][link_build]\n[![Coverage Status][badge_coveralls]][link_coveralls]\n[![mqtt-smarthome](https://img.shields.io/badge/mqtt-smarthome-blue.svg?style=flat-square)](https://github.com/mqtt-smarthome/mqtt-smarthome)\n[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg?style=flat-square)](https://github.com/semantic-release/semantic-release)\n\nThis application can listen to your (Dutch) Smartmeter with a P1 connector, and send the data to several outputs. Currently supporting the following methods:\n\n- JSON TCP socket\n- Raw TCP socket\n- Website with websockets (and ajax fallback) for client side refresh\n- Http json endpoint to get the latest reading\n- Webrequest to external service\n- MQTT (with home assistant integration)\n\nSupporting other services like some website where you can monitor historic data is also possible. [Building your own output](#support-for-output-x) is explained a bit lower on this page.\n\n## Getting started\n\n1. Connect smartmeter\n2. Choose the run method [docker](#running-in-docker) or [bare](#running-locally)\n3. Start the application (for testing)\n4. Run in background using docker container or [PM2](https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/#start-an-app)\n5. Send out a tweet that you are using smartmeter2mqtt on [twitter @svrooij](https://twitter.com/svrooij)\n\n### Running in docker\n\nMy setup is a Raspberry Pi 3 model b rev 1.2 (See `cat /proc/cpuinfo`) with a [P1 cable](#p1-cable) running [Hypriot](https://blog.hypriot.com/downloads/) as an OS (because of the pre-configured docker/docker-compose).\n\nThe [docker image](https://hub.docker.com/r/svrooij/smartmeter) is currently automatically build from every new release. We support the following platforms (can be extended if we have someone willing to test it out):\n\n- AMD64 `linux/amd64`\n- ARM v6 (raspberry pi ?) `linux/arm/v6`\n- ARM v7 (raspberry pi 3/3b) `linux/arm/v7`\n- ARM64 (raspberry pi 4 running in 64 bit) `linux/arm64`\n\n#### Find device ID\n\nIf you're reading from an USB to P1 cable, it's important that you connect the device to the container.\nThe mapped location might change on reboot or if you connect other devices. That is why I recommend to connect the device by serial.\nYou will need the real device location, type `ls /dev/serial/by-id` and note the device string that looks like `usb-FTDI_FT232R_USB_UART_A13LN4ZS-if00-port0` for my [cable](#p1-cable).\n\nBe sure to replace this device id in the docker compose file.\n\n#### Docker compose\n\n```yaml\nversion: \"3.7\"\n\nservices:\n  smartmeter:\n    image: svrooij/smartmeter:latest\n    devices: # Replace the device id with your found id, the device is mapped as /dev/ttyUSB0 inside the container.\n      - /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A13LN4ZS-if00-port0:/dev/ttyUSB0\n    restart: unless-stopped\n    ports: # Depending on your situation you'll need to expose some ports\n      - 3000:3000\n      - 3010:3010\n      - 3020:3020\n    environment:\n      - TZ=Europe/Amsterdam\n      - SMARTMETER_PORT=/dev/ttyUSB0\n      - SMARTMETER_web-server=3000\n      - SMARTMETER_tcp-server=3010\n      - SMARTMETER_raw-tcp-server=3020\n      # - SMARTMETER_sunspec-modbus=192.168.x.x # if you want to also read your solar inverter.\n\n```\n\nYou can set every setting with an environment variable prefixed with `SMARTMETER_`, choose the settings you need.\n\n### Running locally\n\n1. Install `npm i -g smartmeter2mqtt --production`\n2. Figure out what source you want to connect, see below.\n3. Start application to see if it works\n4. Configure to run in background [see stackoverflow answer](https://stackoverflow.com/a/29042953/639153).\n\n## Usage\n\n```Bash\nsmartmeter2mqtt 0.0.0-development\nPublish data from your Smartmeter with a P1 interface to your MQTT server.\n\nRead from P1 to USB serial:\nindex.js --port /dev/ttyUSB0 [options]\n\nRead from tcp socket:\nindex.js --socket host:port [options]\n\nOptions:\n  --port                   The serial port to read, P1 to serial usb, eg.\n                           '/dev/ttyUSB0'\n  --socket                 The tcp socket to read, if reading from serial to\n                           network device, as host:port, like '192.168.0.3:3000'\n  --web-server             Expose webserver on this port                [number]\n  --post-url               Post the results to this url\n  --post-interval          Seconds between posts         [number] [default: 300]\n  --post-json              Post the data as json instead of form parameters\n                                                                       [boolean]\n  --mqtt-url               Send the data to this mqtt server\n  --mqtt-topic             Use this topic prefix for all messages\n                                                         [default: \"smartmeter\"]\n  --mqtt-distinct          Publish data distinct to mqtt               [boolean]\n  --mqtt-discovery         Emit auto-discovery message                 [boolean]\n  --mqtt-discovery-prefix  Autodiscovery prefix       [default: \"homeassistant\"]\n  --tcp-server             Expose JSON TCP socket on this port          [number]\n  --raw-tcp-server         Expose RAW TCP socket on this port           [number]\n  --debug                  Enable debug output                         [boolean]\n  --sunspec-modbus         IP of solar inverter with modbus TCP enabled\n  --sunspec-modbus-port    modbus TCP port               [number] [default: 502]\n  --version                Show version number                         [boolean]\n  -h, --help               Show help                                   [boolean]\n\nAll options can also be specified as Environment valiables\nPrefix them with 'SMARTMETER_' and make them all uppercase\n```\n\n## Inputs\n\nThis application supports two inputs, you'll need either one.\n\n### P1 cable\n\nFor a **direct connection** you'll need a Smartmeter cable like [this one at sossolutions](https://www.sossolutions.nl/slimme-meter-kabel?referal=svrooij), and connect it to a free usb port on the device reading the meter. I've been using this cable for years without any problems.\n\n### TCP socket\n\nYou can also connect to a **TCP socket**, this way you don't need the device running this program to be on a device near your meter.\n\nTested with:\n\n| Device | Meter Type | User | Date |\n|:-------|:-----------|:-----|:-----|\n|[Slimme lezer](https://www.zuidwijk.com/slimme-lezer-smart-reader/?referal=svrooij) by Marcel Zuidwijk | DSMR 4.2 | [@svrooij](https://svrooij.io) | `2021-02-23` |\n\nI'm tempted to recommend the device above since it doesn't require your pi to be near your smartmeter. The latest version of the **Slimme lezer** in combination with a DSMR 5 meter, doesn't even require an external power source.\n\nThis app can also [output a raw socket](#output---raw-tcp-socket) so you can use one instance running all the time and have a second instance connected to the socket for debugging.\n\n### Solar panel inverter (optional)\n\nThis library can also read current solar production from an inverter supporting **SunSpec**. We use [@svrooij/sunspec](https://github.com/svrooij/sunspec) for this, see other package for more info.\n\nBy reading data from the solar panel as well, the properties `houseUsage` and `solarProduction` will become available. The first one is computed as follows `solarProduction + calculatedUsage` if you're producing 1000 watt and the calculatedUsage is -400 (delivering 400 watt), the houseUsage must be 600 watt.\n\n## Outputs\n\nThis application supports multiple (concurrent) outputs. Enable at least one!\n\n### Output -\u003e Webserver\n\nYou can enable the webserver. This will enable you to see a simple webpage with the latest data from your smartmeter (PR with styling appreciated!). It will also enable an endpoint that responds with json with all the available data. Start this output with `--web-server [port]`, and the webpage will be available on `http://[ip-of-server]:[port]/` and the json endpoint will be avaiable on `http://[ip-of-server]:[port]/api/reading`.\n\nThis webpage uses WebSockets for automatic server side data refresh. So the browser will show the latest data as it comes in. If your browser doesn't support websockets it should fallback on ajax loading.\n\n![Screenshot of web interface](./screenshots/screenshot_web.png \"Web interface demo\")\n\n### Output -\u003e JSON tcp socket\n\nThis output creates a tcp socket where you will receive a newline delimeted json stream, to be used in your other applications.\nStart it with the `--tcp-server [portnumer]` parameter. You can then see immediate result when you connect too it with for instance telnet `telnet [ip-of-server] [specified-port]`. Maximum 3 connections.\n\n```Bash\n\u003e telnet 192.168.1.20 3010\nTrying 192.168.1.20...\nConnected to black-pearl.localdomain.\nEscape character is '^]'.\n{\"header\":\"KFM5KAIFA-METER\",\"p1Version\":\"42\",\"powerTs\":\"2020-04-10T10:20:23\",\"powerSn\":\"45303032xxx\",\"totalT1Use\":3000.497,\"totalT2Use\":1000.243,\"totalT1Delivered\":1000.458,\"totalT2Delivered\":3000.394,\"currentTarrif\":2,\"currentUsage\":0.049,\"currentL1\":2,\"currentUsageL1\":0.049,\"deviceType\":\"003\",\"gasSn\":\"4730303xxx\",\"gas\":{\"ts\":\"2020-04-10T10:00:00\",\"totalUse\":2000.671},\"crc\":true,\"calculatedUsage\":49}\n{\"header\":\"KFM5KAIFA-METER\",\"p1Version\":\"42\",\"powerTs\":\"2020-04-10T10:20:33\",\"powerSn\":\"45303032xxx\",\"totalT1Use\":3000.497,\"totalT2Use\":1000.243,\"totalT1Delivered\":1000.458,\"totalT2Delivered\":3000.394,\"currentTarrif\":2,\"currentUsage\":0.048,\"currentL1\":2,\"currentUsageL1\":0.048,\"deviceType\":\"003\",\"gasSn\":\"4730303xxx\",\"gas\":{\"ts\":\"2020-04-10T10:00:00\",\"totalUse\":2000.671},\"crc\":true,\"calculatedUsage\":48}\n```\n\n### Output -\u003e Raw tcp socket\n\nThis output creates a tcp socket where you'll receive the raw data as it comes in. This is usefull if you want to debug the data coming in and don't want to restart your smartmeter2mqtt application all the time. This can in turn be used as an TCP socket input. Start it with `--raw-tcp-server [port]`. Maximum 3 connections.\n\nConect to it with `telnet [ip-of-server] [specified-port]` and see the data coming in on your windows machine.\n\nThis socket can also be used in domoticz as **P1-Wifi Gateway**.\n\n```plain\n\u003e telnet 192.168.1.20 3020\nTrying 192.168.1.20...\nConnected to black-pearl.localdomain.\nEscape character is '^]'.\n/KFM5KAIFA-METER\n\n1-3:0.2.8(42)\n0-0:1.0.0(200410102433S)\n0-0:96.1.1(4530xxx)\n1-0:1.8.1(003000.497*kWh)\n1-0:1.8.2(001000.248*kWh)\n1-0:2.8.1(001000.458*kWh)\n1-0:2.8.2(003000.394*kWh)\n0-0:96.14.0(0002)\n1-0:1.7.0(00.105*kW)\n1-0:2.7.0(00.000*kW)\n0-0:96.7.21(00000)\n0-0:96.7.9(00000)\n1-0:99.97.0(1)(0-0:96.7.19)(000101000001W)(2147483647*s)\n1-0:32.32.0(00000)\n1-0:32.36.0(00000)\n0-0:96.13.1()\n0-0:96.13.0()\n1-0:31.7.0(001*A)\n1-0:21.7.0(00.105*kW)\n1-0:22.7.0(00.000*kW)\n0-2:24.1.0(003)\n0-2:96.1.0(4730xxx)\n0-2:24.2.1(200410100000S)(02000.671*m3)\n!5305\n```\n\n### Output -\u003e Webrequest\n\nThis output will posts the new data to an URL, at an interval (to prevent overloading of remote). You can provide the url to post to with `--post-url [url]`.\n\nYou can also configure the interval with `--post-interval 300` (to set it to 300 seconds).\n\nBy default the data is posted as form variables, if you want you can have it post as json by specifing `--post-json`.\n\n### Output -\u003e MQTT\n\nThis will output the data to the specified mqtt server. You'll need to submit the mqtt url with `--mqtt-url mqtt://[host]:[port]` like `--mqtt-url mqtt://localhost:1883`.\n\n#### Mqtt - Topics\n\nOnce enabled mqtt, this application will send several messages to your mqtt server. All prefixed with `smartmeter` (configurable with `--mqtt-topic`).\n\nTopic: `smartmeter/status/energy`\nPayload:\n\n```json\n{\n  \"header\" : \"KFM5KAIFA-METER\",\n  \"p1Version\" : \"42\",\n  \"powerTs\" : \"2020-04-13T18:22:59\",\n  \"powerSn\" : \"453030\",\n  \"totalT1Use\" : 3000,\n  \"totalT2Use\" : 1000,\n  \"totalT1Delivered\" : 1000,\n  \"totalT2Delivered\" : 3000,\n  \"currentTarrif\" : 1,\n  \"currentDelivery\" : 1.772,\n  \"currentL1\" : 7,\n  \"currentDeliveryL1\" : 1.77,\n  \"deviceType\" : \"003\",\n  \"gasSn\" : \"47303\",\n  \"gas\" : {\n    \"ts\" : \"2020-04-13T18:00:00\",\n    \"totalUse\" : 2000\n  },\n  \"crc\" : true,\n  \"calculatedUsage\" : -1772,\n  \"houseUsage\": 400,\n  \"solarProduction\": 2172\n}\n```\n\nTopic: `smartmeter/status/usage`\nPayload:\n\n```json\n{\n  \"previousUsage\" : -1746,\n  \"relative\" : -8,\n  \"message\" : \"Usage decreased -8 to -1754\",\n  \"val\" : -1754,\n  \"tc\" : 1586795117062\n}\n```\n\n#### MQTT - Auto discovery homeassistant\n\nIf you're running home assistant, be sure to enable mqtt discovery `--mqtt-discovery` and `--mqtt-discovery-prefix` (defaults to `homeassistant`). This will make sure the following sensors will automatically show up in home assistant:\n\n- **Current usage**: Your current total usage (can be negative when delivering power)\n- **Total used T1**: Total power consumed from the grid in T1\n- **Total used T2**: Total power consumed from the grid in T2\n- **Total delivered T1**: Total power delivered to the grid in T1\n- **Total delivered T2**: Total power delivered to the grid in T2\n\n## Developer section\n\nThis section is for the curious ones.\n\n### Support for output X\n\nThis package comes with several outputs, they all extend [Output](https://github.com/svrooij/smartmeter2mqtt/blob/master/src/output/output.ts).\nEvery new output should implement the `start(p1Reader: P1Reader): void` and the `close():Promise\u003cvoid\u003e` methods.\nThey all get the instance of the current [P1Reader](https://github.com/svrooij/smartmeter2mqtt/blob/master/src/p1-reader.ts).\nSo your new output should subscribe to one of the events.\nAll events are defined in [P1ReaderEvents](https://github.com/svrooij/smartmeter2mqtt/blob/master/src/p1-reader-events.ts) and you should use the statics from the class, (even though they are just strings).\n\n- **P1ReaderEvents.ParsedResult** to get the parsed result (if crc check validates), probably the one you want.\n- **P1ReaderEvents.UsageChange** to get the changes in current usage. Already computed you dont have to.\n- **P1ReaderEvents.Line** to get every line when they come in.\n- **P1ReaderEvents.Raw** to get every raw message. Is transmitted as a complete string when the endline is received.\n\nIf you start some kind of server, be sure to stop it in the `close()` method.\n\nEvery output is wired to the input in the [index.ts](https://github.com/svrooij/smartmeter2mqtt/blob/master/src/index.ts) file in the `startOutputs()` method.\nYou initialize the correct output and push it to the `this.outputs` array. The `start` and `close` methods are called automaticcaly.\n\nConfiguration is done in the [config.ts](https://github.com/svrooij/smartmeter2mqtt/blob/master/src/config.ts) file.\nDepending on your output you might want to create a single config entry to enable it or a nested configuration like for mqtt.\nThis class is also responsible for parsing the input and converting it to the strong-typed config.\n\n```JavaScript\nif (this.config.outputs.mqtt) {\n  console.log('- Output: Mqtt to %s', this.config.outputs.mqtt.url);\n  this.outputs.push(new MqttOutput(this.config.outputs.mqtt));\n}\n```\n\nYour output will get an event every 10 seconds, if you only want daily results you will need to build some logic to skip events.\n\n### Run tests before PR\n\nThis library enforces these eslint rules (with some exceptions that will be removed soon):\n\n- `eslint:recommended`\n- `plugin:@typescript-eslint/eslint-recommended`\n- `plugin:@typescript-eslint/recommended`\n- `airbnb-typescript/base`\n\nIn the [tests](./tests) folder are several tests defined.\nSo we don't break any existing code.\nBoth the javascript styles and the tests can be run with `npm run test` in the main folder.\n\n### Build docker image\n\nThe Dockerfile is setup to support multi-architectures builds. You can build this image on you regular 64 bit computer for these platforms. `arm` / `arm64` / `amd64` by using the following command:\n\n```bash\n# For pushing to docker hub\ndocker buildx build -t svrooij/smartmeter:alpha --platform linux/amd64,linux/arm/v7,linux/arm64 --push .\n# For loading it to your local machine\ndocker buildx build -t svrooij/smartmeter:alpha --platform linux/amd64,linux/arm/v7,linux/arm64 --load .\n# Regular build (no buildx installed)\ndocker build -t svrooij/smartmeter:alpha .\n```\n\n### DSMR - P1 Sample data\n\nMy Keifa meter outputs the following data as you connect to the serial connection. Other meters should be supported as well. Else please start with `--debug` and send one full output to us.\n\n```plain\n/KFM5KAIFA-METER            // Header, Manufacturer specific\n\n1-3:0.2.8(42)               // Version information P1 output\n0-0:1.0.0(190514213620S)    // Timestamp YYMMDDhhmmssX (X=S DST/W no DST)\n0-0:96.1.1(453xxxxxxxxxx)   // Electricity Meter serial number\n1-0:1.8.1(002000.123*kWh)   // Total used in T1\n1-0:1.8.2(001000.456*kWh)   // Total used in T2\n1-0:2.8.1(001000.456*kWh)   // Total delivered back in T1\n1-0:2.8.2(002000.789*kWh)   // Total delivered back in T2\n0-0:96.14.0(0001)           // Current Tarrif\n1-0:1.7.0(00.329*kW)        // Current use in P+ (watt resolution)\n1-0:2.7.0(00.000*kW)        // Current delivery in P- (watt resolution)\n0-0:96.7.21(00000)          // Number of power failures in any phase\n0-0:96.7.9(00000)           // Number of long power failures in any phase\n1-0:99.97.0(1)(0-0:96.7.19)(000101000001W)(2147483647*s) // Long power failures log (can be multiple)\n1-0:32.32.0(00000)          // Number of voltage sags in phase L1\n1-0:32.36.0(00000)          // Number of voltage swells in phase L1\n0-0:96.13.1()               // Text message max 1024 characters?? Undocumented\n0-0:96.13.0()               // Text message max 1024 characters??\n1-0:31.7.0(002*A)           // Instantaneous current L1 in A resolution.\n1-0:21.7.0(00.329*kW)       // Instantaneous power L1 (P+) in watt resolution.\n1-0:22.7.0(00.000*kW)       // Instantaneous active power L1 (P-) in watt resolution.\n0-2:24.1.0(003)             // Device type\n0-2:96.1.0(473xxx)          // Gas meter serial number\n0-2:24.2.1(190514210000S)(01543.012*m3)  // Gas usages timestamp and gas usage\n!90E4                       // CRC\n```\n\n### Parsing messages explained\n\nThe [p1-reader](https://github.com/svrooij/smartmeter2mqtt/blob/master/src/p1-reader.ts) is responsible for connecting to one of the sources, it is an eventemitter that outputs the following events `line`, `dsmr`, `raw`, `usageChange`.\nIt will send each line to the [p1-parser](https://github.com/svrooij/smartmeter2mqtt/blob/master/src/p1-parser.ts) for parsing and checking the message.\nTo support extra data, you'll need to take a look at the [p1-map](https://github.com/svrooij/smartmeter2mqtt/blob/master/src/p1-map.ts) file, it contains the **id** used in the DSMR standard, the name in the result object and a **valueRetriever**.\nThe **valueRetriever** is passed an array of values that where between brackets in the current line.\n\nSupporting other data fields is just a matter of changing the **p1-map** file.\n\n[badge_docker]: https://img.shields.io/docker/pulls/svrooij/smartmeter\n[badge_sponsor]: https://img.shields.io/badge/Sponsor-on%20Github-red\n[badge_build]: https://github.com/svrooij/smartmeter2mqtt/workflows/Run%20tests%20and%20publish/badge.svg\n[badge_coveralls]: https://coveralls.io/repos/github/svrooij/smartmeter2mqtt/badge.svg?branch=master\n\n[link_build]: https://github.com/svrooij/smartmeter2mqtt/actions\n[link_coveralls]: https://coveralls.io/github/svrooij/smartmeter2mqtt?branch=master\n[link_sponsor]: https://github.com/sponsors/svrooij\n[link_docker]: https://hub.docker.com/r/svrooij/smartmeter\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsvrooij%2Fsmartmeter2mqtt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsvrooij%2Fsmartmeter2mqtt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsvrooij%2Fsmartmeter2mqtt/lists"}