Mit der Hilfe eines ESP8266 und eines einfachen IR Modules kann am Stromzähler der aktuelle Stromverbrauch ausgelesen werden ohne das man den Stromzähler PIN benötigt. Die ausgelesenen Werte können dann mittels Home Assistant HASSIO grafisch dargestellt werden.

Das ganze ist entstanden aufgrund meines Balkonkraftwerkes. Ich wollte einfach wissen was ich aktuell einspeise und was ich verbrauche. Bei einem Balkonkraftwerk sollte man vor dem Kauf wissen welchen Grundverbrauch man hat damit man ermitteln kann ob es sich überhaupt lohnt ein doppeltes Solarmodul mit 600W zu kaufen oder doch lieber ein einzelnes mit 300W. Aktuell habe ich ein 300W Solarmodul am EG Stromzähler und ein doppeltes Modul mit 600W am OG Stromzähler hängen. Dadurch ist der Grundbedarf gedeckt und die Solarmodule sollten sich nach ca. 4-5 Jahren amortisiert haben.

Hier geht es zu meiner Standalone Lösung ohne Home Assistant.

Digitaler Stromzähler

Benötigte Hardware

Benötigte Software

3D Gehäuse Tinkercad

Aufbau

IR Modul TCRT5000 modifikation

Auf dem TCRT5000 befindet sich eine Lesediode und eine Schreibdiode. Die Schreibdiode wird auch als Näherungssensor verwendet wodurch es zu Problemen kommen kann beim Ablesen des Stromzählers.

In meinem Fall habe ich die hellere (weiße Diode) einfach ausgelötet. In anderen Beiträgen habe ich gesehen das auch nur der Vorwiderstand entfernt wird.

Den TCRT5000 habe ich am Nodemcuv2 an den Pins D5, 3V3 und GND angeschlossen die direkt nebeneinander liegen.

eHz Elektronischer Haushaltszähler

eHz Digitaler Stromzähler (ESP8266)

Das Gehäuse aus dem 3D Drucker passt beim eHz Elektronischen Haushaltszähler. Mit zwei Magneten wird das Gehäuse am Zähler befestigt da der Stromzähler Eigentum des Netzbetreibers ist!

Die rechten beiden IR Dioden werden beim IR Lese-Schreibekopf verwendet (Volkszähler). Dabei wird permanent zwischen den Unterschiedlichen zur verfügung stehenden Zählerständen geschalten und diese ausgelesen (PIN muss beim jeweiligen Energiekonzern angefragt werden).

In unserem Fall benutzen wir die mittlere IR-Diode zum auslesen des aktuellen Stromverbrauchs am Zähler. Zum testen einfach den IR Sensor mit der Hand an die zu testende IR-Diode halten und in den ESP-Home live loggs schauen ob sich der Wert verändert. Ich hatte noch einen Baustrahler im Keller angeschlossen um zu schauen ob die Werte plausibel sind.

Ein Sensor am ESP8266

ESP Home ein Sensor config.yaml

Update Intervall ist hier in der yaml auf 60s eingestellt. Alle 60s sollte sich der aktuelle Stromverbrauch ändern.

esphome:
  name: strom
  platform: ESP8266
  board: nodemcuv2
  
# Sensor configuration
sensor:
  - platform: pulse_counter
    pin: D5
    name: "Energieverbrauch"
    unit_of_measurement: 'W'
    update_interval: 60s
    filters:
      - multiply: 6
    accuracy_decimals: 0
    icon: 'mdi:flash'
    id: energieverbrauch_w
    
  - platform: total_daily_energy
     name: "Tagesverbrauch"
     power_id: energieverbrauch_w

time:
  - platform: sntp
    id: my_time

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: „xxxxxxxxxx“

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

captive_portal:

Home Assistant grafische Darstellung

Spannungsversorgung Verteilerkasten

Aktuell habe ich im Haus an jedem meiner Zähler einen Sensor mit Magnet befestigt. Die Sensoren sind an einem ESP8266 nodemcuv2 angeschlossen (Spannung, Masse, D5 und D6).

Die Zählerschranksteckdose die den Nodemcuv2 betreibt habe ich mir extra dafür eingebaut

ESP Home Logs

INFO Reading configuration /config/esphome/strom.yaml...
INFO Detected timezone 'CET' with UTC offset 1 and daylight saving time from 27 March 02:00:00 to 30 October 03:00:00
INFO Starting log output from strom.local using esphome API
INFO Successfully connected to strom.local
[19:32:31][I][app:102]: ESPHome version 2021.9.3 compiled on Oct 10 2021, 21:35:03
[19:32:31][C][wifi:501]: WiFi:
[19:32:31][C][wifi:361]:   SSID: 'xxxxxxxxxxxxxxx'[redacted]
[19:32:31][C][wifi:362]:   IP Address: xxx.xxx.xxx.xx
[19:32:31][C][wifi:364]:   BSSID: xx:xx:xx:xx:xx:xx[redacted]
[19:32:31][C][wifi:365]:   Hostname: 'strom'
[19:32:31][C][wifi:369]:   Signal strength: -51 dB ▂▄▆█
[19:32:31][C][wifi:373]:   Channel: 6
[19:32:31][C][wifi:374]:   Subnet: 255.255.255.0
[19:32:31][C][wifi:375]:   Gateway: xxx.xxx.xxx.x
[19:32:31][C][wifi:376]:   DNS1: xxx.xxx.xxx.x
[19:32:31][C][wifi:377]:   DNS2: (IP unset)
[19:32:31][C][logger:193]: Logger:
[19:32:31][C][logger:194]:   Level: DEBUG
[19:32:31][C][logger:195]:   Log Baud Rate: 115200
[19:32:31][C][logger:196]:   Hardware UART: UART0
[19:32:31][C][pulse_counter:147]: Pulse Counter 'Energieverbrauch'
[19:32:31][C][pulse_counter:147]:   State Class: 'measurement'
[19:32:31][C][pulse_counter:147]:   Unit of Measurement: 'W'
[19:32:31][C][pulse_counter:147]:   Accuracy Decimals: 0
[19:32:31][C][pulse_counter:147]:   Icon: 'mdi:flash'
[19:32:31][C][pulse_counter:148]:   Pin: GPIO14 (Mode: INPUT)
[19:32:31][C][pulse_counter:149]:   Rising Edge: INCREMENT
[19:32:31][C][pulse_counter:150]:   Falling Edge: DISABLE
[19:32:31][C][pulse_counter:151]:   Filtering pulses shorter than 13 µs
[19:32:31][C][pulse_counter:152]:   Update Interval: 60.0s
[19:32:31][C][total_daily_energy:024]: Total Daily Energy 'Tagesverbrauch'
[19:32:31][C][total_daily_energy:024]:   Device Class: 'energy'
[19:32:31][C][total_daily_energy:024]:   State Class: 'total_increasing'
[19:32:31][C][total_daily_energy:024]:   Unit of Measurement: 'Wh'
[19:32:31][C][total_daily_energy:024]:   Accuracy Decimals: 2
[19:32:31][C][total_daily_energy:024]:   Icon: 'mdi:flash'
[19:32:31][C][captive_portal:148]: Captive Portal:
[19:32:31][C][ota:029]: Over-The-Air Updates:
[19:32:31][C][ota:030]:   Address: strom.local:8266
[19:32:31][C][ota:032]:   Using Password.
[19:32:31][C][api:135]: API Server:
[19:32:31][C][api:136]:   Address: strom.local:6053
[19:32:31][C][api:140]:   Using noise encryption: NO
[19:32:31][C][sntp:044]: SNTP Time:
[19:32:31][C][sntp:045]:   Server 1: '0.pool.ntp.org'
[19:32:31][C][sntp:046]:   Server 2: '1.pool.ntp.org'
[19:32:31][C][sntp:047]:   Server 3: '2.pool.ntp.org'
[19:32:31][C][sntp:048]:   Timezone: 'CET-1CEST-2,M3.4.0/2,M10.5.0/3'
[19:32:32][D][pulse_counter:159]: 'Energieverbrauch': Retrieved counter: 68.00 pulses/min
[19:32:32][D][sensor:121]: 'Energieverbrauch': Sending state 408.00000 W with 0 decimals of accuracy
[19:32:32][D][sensor:121]: 'Tagesverbrauch': Sending state 6002.70361 Wh with 2 decimals of accuracy
[19:32:32][D][pulse_counter:159]: 'Energieverbrauch': Retrieved counter: 68.00 pulses/min
[19:32:32][D][sensor:121]: 'Energieverbrauch': Sending state 408.00000 W with 0 decimals of accuracy
[19:32:32][D][sensor:121]: 'Tagesverbrauch': Sending state 6002.70361 Wh with 2 decimals of accuracy
[19:33:32][D][pulse_counter:159]: 'Energieverbrauch': Retrieved counter: 67.00 pulses/min
[19:33:32][D][sensor:121]: 'Energieverbrauch': Sending state 402.00000 W with 0 decimals of accuracy
[19:33:32][D][sensor:121]: 'Tagesverbrauch': Sending state 6009.40381 Wh with 2 decimals of accuracy

Zwei Sensoren an einem ESP8266

Natürlich kann man auch zwei Stromzähler mit einem ESP8266 betreiben.

An den grün markierten Stellen haben ich die Jumper wire eingesteckt.

ESP Home zwei Sensoren config.yaml

esphome:
  name: strom
  platform: ESP8266
  board: nodemcuv2
  
# Stromzähler OG
sensor:
  - platform: pulse_counter
    pin: D5
    name: "Energieverbrauch_OG"
    unit_of_measurement: 'W'
    update_interval: 60s
    filters:
    # RL = 10000 Imp./kWh 
      - multiply: 6    
    accuracy_decimals: 0
    icon: 'mdi:flash'
    id: energieverbrauch_og
    
  # Dieser Sensor errechnet die Wh aus den aktuellen Verbrauchswerten in W  
  - platform: total_daily_energy
    name: "Tagesverbrauch_OG"
    power_id: energieverbrauch_og

# Stromzähler EG    
  - platform: pulse_counter
    pin: D6
    name: "Energieverbrauch_EG"
    unit_of_measurement: 'W'
    update_interval: 60s
    filters:
    # RL = 10000 Imp./kWh 
      - multiply: 6
    accuracy_decimals: 0
    icon: 'mdi:flash'
    id: energieverbrauch_eg
    
  # Dieser Sensor errechnet die Wh aus den aktuellen Verbrauchswerten in W  
  - platform: total_daily_energy
    name: "Tagesverbrauch_EG"
    power_id: energieverbrauch_eg    
    
time:
  - platform: sntp
    id: my_time

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

captive_portal:

ESP Home Logs zwei Sensoren

[11:22:17][D][pulse_counter:159]: 'Energieverbrauch_EG': Retrieved counter: 2.00 pulses/min
[11:22:17][D][sensor:121]: 'Energieverbrauch_EG': Sending state 12.00000 W with 0 decimals of accuracy
[11:22:17][D][sensor:121]: 'Tagesverbrauch_EG': Sending state 146.35190 Wh with 2 decimals of accuracy

[11:22:17][D][pulse_counter:159]: 'Energieverbrauch_OG': Retrieved counter: 96.00 pulses/min
[11:22:17][D][sensor:121]: 'Energieverbrauch_OG': Sending state 576.00000 W with 0 decimals of accuracy
[11:22:17][D][sensor:121]: 'Tagesverbrauch_OG': Sending state 516.67249 Wh with 2 decimals of accuracy

[11:23:17][D][pulse_counter:159]: 'Energieverbrauch_EG': Retrieved counter: 0.00 pulses/min
[11:23:17][D][sensor:121]: 'Energieverbrauch_EG': Sending state 0.00000 W with 0 decimals of accuracy
[11:23:17][D][sensor:121]: 'Tagesverbrauch_EG': Sending state 146.35190 Wh with 2 decimals of accuracy

[11:23:17][D][pulse_counter:159]: 'Energieverbrauch_OG': Retrieved counter: 98.00 pulses/min
[11:23:17][D][sensor:121]: 'Energieverbrauch_OG': Sending state 588.00000 W with 0 decimals of accuracy
[11:23:17][D][sensor:121]: 'Tagesverbrauch_OG': Sending state 526.47168 Wh with 2 decimals of accuracy

Wie man dem Log entnehmen kann ist im unteren Abschnitt bei EG 0.00 Pulses zu sehen, bitte nicht verwundern das liegt an meinem Balkonkraftwerk was gerade mehr Leistung generiert als verbraucht wird.

Wemos D1 mini

Das ganze kann auch mit einem Wemos D1 mini realisiert werden. Der einzige Unterschied besteht darin das die Software unter ESPHome richtig kompiliert werden muss. Dazu muss die Board Version geändert werden. Wenn ihr den Sensor am Board angeschlossen habt könnt ihr euren Aufbau mittels einer einfachen Taschenlampe testen. Einfach mit der Taschenlampe über die Diode am TCRT fahren. Dabei sollte die LED am TCRT blinken. In den Logs solltet dann auch der Counter ansteigen.

......

esp8266:
  board: d1_mini

......

Bei weiteren Fragen einfach schreiben.

Short description

SodaStream Oled Display

Everyone who owns a SodaStream has probably asked themselves how full my CO2 cylinder is. In most cases the cylinder is empty once you have been shopping. Most SodaStream users have a second cylinder, but it still sparked my creativity to come up with a simple solution.

The small software program is currently used to determine the number of impacts pressed and shown on the display (line 2). In line 3 is the added time of the duration / length of the pushed pushes. These values can be used to roughly estimate how much Co2 is still in the cylinder. What is shown graphically in line 4 by means of a progress indicator.

Hardware required

  • Wemos D1 mini (ESP8266)
  • Limit switch Ender 3 Pro
  • OLED Display I2C 0,96 Zoll
  • Cable / single wires
  • 3D Printer + Filament
  • Soldering iron with equipment

Software required

  • Arduino IDE
  • Tinkercad
  • Ultimaker Cura / Prusa Slicer

3D Printer settings

Ender 3 Pro

Print Settings

3D Printer Tinkercad STL File

Tinkercad SodaStream

Arduino IDE Software Code

I have to adapt to publish (currently code excerpt).

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP8266WiFi.h>

#define SCREEN_WIDTH 128 // display width, (pixels)
#define SCREEN_HEIGHT 64 // display height, (pixels)

// I2C connected display SSD1306 
#define OLED_RESET     0 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES     10 // Number of snowflakes in the animation example

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

Result Pictures

ToDo

  • Wemos D1 Mini ESP.deepSleep
  • One Case for alle the stuff
  • Smaler Display Case
  • Battery shield + display battery status
  • Change Wemos D1 Mini to ESP8266 BLE + IOS App

Control of a relay module using an Arduino Nano v3

Since I have to reset my work hardware or switch the voltage several times a day from home office, I built a small circuit from an old Arduino Nano v3 and a relay module that enables me to do this. Since I found it awkward to start the relay every time via the Arduino IDE with the serial monitor, I also wrote a GUI that can be executed using JAVA JDK for easy handling.

Hardware required

  • Arduino Nano v3
  • Relais Modul
  • RGB LED (not needed)
  • Single Wires
  • Solder stuff
  • 3D Printed case

Schematics

Tinkercad circuits Arduino Nano

Code

Code for Arduino IDE which worked with the attached GUI.

#define LEDR 8     // red
#define LEDG 9     // green
#define LEDB 10    // blue
#define RELAIS 11  // relais

void setup() {

  // set LED's pin to output mode
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
  pinMode(RELAIS, OUTPUT);
  
  Serial.begin(9600);          //start serial communication @9600 bps
}

void loop(){
  
  if(Serial.available()){      //id data is available to read

    char val = Serial.read();

    if(val == 'b'){             //if b received
      digitalWrite(11, HIGH);   //turn on relais
      digitalWrite(10, HIGH);   //turn on green led
    }
    if(val == 'f'){            //if f received
      digitalWrite(11, LOW);    //turn off all led
      digitalWrite(10, LOW);
    }      
  }
}

Processing IDE GUI for MacOS

With Processing IDE it is easy to create a JAVA GUI for Arduino which is running on MAC OS X and Windows. The only think what you have to install additional is the latest JAVA SDK.

3D Printer Settings

Print Settings

Result

Home Assistant Einstellungen zum senden einer Telegram Nachricht durch drücken des Ikea Shortcut Knopfes

Mit der IKEA Tradfri Serie hat es das schwedische Unternehmen in den Smart Home-Markt geschafft. Damit ist es für jedermann auf einfachste Weise möglich Lampen, Steckdose, Rollos oder Lautsprecher via App zu steuern oder sogar zu automatisieren. Laut Ikea ist die aktuellen Serie auch noch nicht am Ende seiner Entwicklung und wird stetig weiterentwickelt. Das Home Smart System soll im kommenden Jahr noch durch weitere Produkte ergänzt werden.

Was benötige ich alles für den Shortcut Button Telegram Alarm

Raspberry Pi einrichten

Wie man die SD Karte mit dem Home Assistant Operating System flashed findet man hier.
Nachdem die SD Karte geflashed, eingesteckt und der Raspberry Pi angeschaltet ist sollte die Weboberfläche des Home Assistant nach wenigen Minuten erreichbar sein. Das Einrichten und eine kurze Einleitung ist hier zu finden.

IKEA TRÅDFRI und Shortcut-Button einrichten

Das einrichten des IKEA Gateways und Shortcut-Buttons findet man im Netz und auf der Ikea Homepage zu genüge dadurch werde ich nicht genauer darauf eingehen. Falls Nachfragen bestehen dann einfach in die Kommentare schreiben.

Einrichten von Telegram unter Home Assistant

Um den Telegram Messenger in den Home Assistant einzubinden muss ein File auf dem Raspberry Pi angepasst werden. Das Anpassen des Files ist deutlich einfacher wenn man das Add-On “File Editor” installiert. Anschließend muss im “/config” Ordner die “configuration.yaml” Datei angepasst werden. Nach dem Anpassen einfach Speichern drücken. Wie man an den API_KEY und die eigene Chat ID kommt findet man hier.

# Beispiel configuration.yaml für den Telegram Bot
telegram_bot:
  - platform: polling 
    api_key: INSERTKEYHERE
    allowed_chat_ids: 
      - FIRSTCHATID 
      - SECONDCHATID 

# Beispiel configuration.yaml für den zu Benachrichtigten
notify:
   - name: SE_Message
     platform: telegram
     chat_id: FIRSTCHATID

# Wenn benötigt für den zweiten zu Benachrichtigten
   - name: ME_Message
     platform: telegram
     chat_id: SECONDCHATID 

Home Assistant Automatisierung

Unter Einstellungen -> Automatisierungen kann mittels “+ Automatisierung hinzufügen” eine neue Automation hinzugefügt werden. Einfach auf “Erstellen” und beim nächsten Fenster auf “Überspringen” drücken. Die einstellungen die ich Vorgenommen habe sind auf den nachfolgenden Bildern am besten zu sehen.

IKEA TRÅDFRI Setup
IKEA TRÅDFRI Setup
IKEA TRÅDFRI Setup

Jetzt nur noch speichern und nach dem drücken sollten die ersten Nachrichten aufm dem Handy eintreffen.

Nachträglich eine Anleitung zu schreiben ist immer schwer weil man meistens doch noch etwas vergisst zu notieren. Im falle von Fehlenden Informationen einfach eine Nachricht schreiben, ich versuche sie dann so schnell es geht zu beantworten. Vielleicht finde ich noch eine Möglichkeit einer Home Assistant Widget Darstellung via Scriptable.

WordPress as a data source with .json for Scriptable IOS App

Creating a WordPress site is no longer a specialty with the provided themes. The idea of using WordPress not only as a standard website, but also as a data source / database can be implemented by using a two-line PHP script. We need this script to upload a .json file in WP under media which is normally blocked.

<?php
function cc_mime_types($mimes) {
    $mimes['json'] = 'application/json';
    $mimes['svg'] = 'image/svg+xml';

    return $mimes;
}
add_filter('upload_mimes', 'cc_mime_types');

https://github.com/SmonSE/englishForIT/blob/main/wpJson.zip

Installation of your own WordPress plugin

After creating the plugin (ZIP file which includes the php script) it can be installed via the dashboard.

  1. First click on > Plugins > Add new.
  2. Then click on the “Upload plugin” button at the top.
  3. Now select the ZIP file and confirm the “Install now” button.
  4. After the file has been uploaded, you can activate the plugin.

Create your own .json file

Code excerpt from the json file.

// example
{
  "englishIt": "Vocabulary for IT english",
  "createdAt":"2021-03-18 11:43:00.000000",
  "vocabulary":[
    {
      "pos:": "000",
      "english": "Avatar",
      "german": "Benutzerbild",
      "meaning": "An icon or figure that represents .... ."
    },
    {
      "pos:": "001",
      "english": "Bug",
      "german": "Fehler",
      "meaning": "A defect or fault in a program ... ."
    }
  ]
}

Get data source by Scriptable Widget

Collecting data source from .json file which is uploaded on WordPress media.

// example
async function getNewCasesData(){
  let url = "https://../../../englishForItVocs.json";
  let req = new Request(url);
  let apiResult = await req.loadJSON();

return apiResult;
}

Read out values from .json file.

// example
async function createWidget() {
  const list = new ListWidget();
  const vocEng = list.addText(apiData.vocs[0].english);
  const meaning = list.addText(apiData.vocs[0].meaning);

return list;
}