Mit der Hilfe eines ESP32 und eines einfachen IR Moduls kann am Stromzähler der aktuelle Stromverbrauch ausgelesen werden ohne das man den Stromzähler PIN benötigt. Auf der Suche nach einer Alternative zu der doch komplizierten WebServer Lösung bin ich auf die Arduino IoT Cloud Seite gestoßen. Nach kürzester Zeit hatte ich die Daten meines ESP32 + IR Moduls auf dem Handy Bildschirm.

Arduino IoT Cloud Remote App

Arduino IoT Remote App
Die Werte sind so niedrig da mein Solarkraftwerk zu dem Zeitpunkt Strom generiert hat.

Benötigte Hardware

  • ESP32-WROOM-32 D1 mini (AZ-Delivery)
  • IR Modul (TCRT5000) 
  • 3D Drucker + Filament
  • Lötstation mit Equipment
  • Einzeladern

Benötigte Software

Aufbau Gehäuse

Das neue Zählergehäuse findet man hier.

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, dass auch nur der Vorwiderstand entfernt wurde. 

Den TCRT5000 habe ich am ESP32 an die Pins G14, 5V und GND angeschlossen.

eHz Elektronischer Haushaltszähler

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 Netzbetreiber angefragt werden).

Zähler Aufsteckmodul ESP32 + TCRT5000

Einrichten von Arduino IoT Cloud Remote

Nachdem man sich bei Arduino Cloud IoT registriert hat, kann man sich ein neues Projekt mit dem Button “Create” anlegen. Anschließend sind die Felder Devices, Network und Variables auszufüllen. Das Setup von Devices und Network ist eigentlich selbsterklärend, daher werde ich nicht genauer auf diese beiden Punkte eingehen.

Variables

Durch drücken des Add Button kann man eine Variable hinzufügen. In unserem Fall lautet die Variable “Strom”. Als Datentyp verwenden wir einen integer number mit der permission Read only. Bei send value geben wir on change (threshold: 0) an. Das ganze sollte dann so aussehen.

Die Variable Strom wird im Sketch angegeben und automatisch generiert. Das heißt sie muss im Code nicht extra deklariert werden (kann direkt verwendet werden).

Dashboard

Damit wir später an der Handy App das Diagramm zu sehen bekommen müssen wir unter Dashboards ein Chart hinzufügen mit dem Button “Add”. Hier muss man nur noch die Verlinkung zwischen Chart und der Variable Strom herstellen (rechts außen).

Code (Sketch)

/* 
  Sketch generated by the Arduino IoT Cloud Thing "Untitled"
  https://create.arduino.cc/cloud/things/xxxx-xxxx-xxxx-xxxx 

  Arduino IoT Cloud Variables description

  The following variables are automatically generated and updated when changes are made to the Thing

  int strom;

  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/

#include "thingProperties.h"
#include <time.h>

/* Configuration of NTP */
#define MY_NTP_SERVER "2.europe.pool.ntp.org"
#define MY_TZ "CET-1CEST,M3.5.0,M10.5.0/3"

/* Globals NTP */
time_t now;
tm tm;

/* Sensor TCRT5000 PIN14 */
const int digital_pin = 14;
int state = 0;
int laststate = 1;
double watt = 0;
unsigned int counter = 0;

/* Update Time for Chart */
int period = 60*1000; // 1min
unsigned long time_now = 0;

/* Reset function after page update */
void resetFunc(){
  counter = 0;
  watt = 0;
}

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
 /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
  
  /* Time NTP */
  configTime(0, 0, MY_NTP_SERVER); 
  setenv("TZ", MY_TZ, 1); // Set your time zone
  tzset();
  
  delay(1000);
}

void loop() {
  ArduinoCloud.update(); 

  // Impulse counter to watt
  state=digitalRead(digital_pin);
  if ( laststate == 1 && state == 0 )
  {
    counter++;
  }
  laststate = state;

  watt = counter * 6;
  
  if(millis() >= time_now + period){
    time_now += period;
    strom = watt;
    resetFunc();
    Serial.println(strom);
  }
}

/*
  Since Strom is READ_WRITE variable, onStromChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onStromChange()  {
  // Add your code here to act upon Strom change
}

Handy IoT Remote App

Mit der Hilfe eines ESP32 und eines einfachen IR Moduls kann am Stromzähler der aktuelle Stromverbrauch ausgelesen werden ohne das man den Stromzähler PIN benötigt. Mittels einem WebServer der vom ESP32 aufgebaut wird kann der aktuelle Verbrauch ausgelesen und grafisch dargestellt werden.

Da nicht jeder das Know-how bzw. die Lust hat sich einen kompletten HomeAssistant einzurichten um den Energieverbrauch auszulesen habe ich mir eine Standalone Lösung überlegt. Dadurch werden auch die Kosten der Anschaffung stark minimiert. Die Kosten für das benötigte Material belaufen sich auf unter 15€ (je nach Bauteile / Hersteller).

Alternative Lösung via Arduino IoT Remote App (nur ein File zu flashen).

Wer eine Home Assistant am laufen hat kann sich gerne meine Hassio Lösung anschauen, hier.

Digitaler Stromzähler Standalone WebServer

Benötigte Hardware

  • ESP32-WROOM-32 D1 mini (AZ-Delivery)
  • IR Modul (TCRT5000) 
  • 3D Drucker + Filament
  • Lötstation mit Equipment
  • Einzeladern

Benötigte Software

Aufbau Gehäuse

Das neue Zählergehäuse findet man hier.

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, dass auch nur der Vorwiderstand entfernt wird.

Den TCRT5000 habe ich am ESP32 an die Pins G14, 5V und GND angeschlossen.

eHz Elektronischer Haushaltszähler

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).

Zähler Aufsteckmodul ESP32 + TCRT5000

Einrichten des WebServers

Der Wemos D1 mini ESP32 generiert zu Beginn sein eigenes WLAN (SSID = StromZaehler). Wenn man dieses auswählt kann man über die statische IP: 192.168.4.1 den Wi-Fi Manager öffnen um dort von seinem eigene Heimnetz die SSID und das Passwort zu hinterlegen. Das Gateway (Router IP) muss angegeben werden da sonst Zeit und Datum nicht mit dem NTP Server abgeglichen werden können. Bei einem nicht funktionierenden NTP Server werden die Werte um Mitternacht nicht zurückgesetzt. Die Daten sind direkt auf dem ESP32 im Filessystem hinterlegt und können nicht nach außen gelangen.

SSID: Wlan Name

Password: Wlan Passwort

IP Adresse: WebServer IP

Gateway Adresse: Router IP

WebServer grafische Darstellung

Den WebServer mit der Sensor Auswertung erreicht man dann über die im Wi-Fi Manager konfigurierten

WebServer on ESP32

Stromversorgung ESP32

Man kann den ESP32 auch mit einer Powerbank betreiben. Dabei muss man aber bedenken das durch den WebServer (permanentes WiFi) der Stromverbrauch sehr hoch ist. Da meine Lösung ja nur zum aktuellen Energieverbrauch messen gedacht ist bzw. um zu schauen was man so über einen kompletten Tag verbraucht, reicht eine Powerbank aus.

Wer die Energiewerte dauerhaft auslesen möchte sollte sich dann doch lieber eine Schuko Steckdose in den Verteilerkasten montieren lassen.

Software

Der ESP32 enthält ein File System (SPIFFS). SPIFFS ist ein kleines Dateisystem, das für Mikrocontroller mit einem Flash-Chip entwickelt wurde die über einen SPI-Bus verfügen. Unter dieser Seite kann man die genaue Anleitung finden und wie man dieses File System einrichtet. Anstelle des Temperatursensoren muss man nur den TCRT5000 anlöten sowie minimale Anpassungen an der Software vornehmen.

Code

/* Sensor TCRT5000 PIN14*/
const int digital_pin = 14;
int state = 0;
int laststate = 1;
unsigned int counter = 0;

......

/* Loop sensor reading*/
void loop() {

  state=digitalRead(digital_pin);
  if ( laststate == 1 && state == 0 )
  {
    counter++;
  }
  
  laststate = state;
  watt = counter * 6;
}

Fazit

Mit der Energieverbrauch Messung kann man sehr schnell sehen wo sich die Stromfresser im Haushalt befinden. Wir haben bei der letzten Messung herausgefunden, dass der SAECO Kaffeevollautomat im eingeschalteten Zustand während dem Frühstück 400W zieht. Das liegt an dem permanent aktiven Heizelement. Der Standby Timer lag bei 30 Minuten was zu einem hohen Stromverbrauch in der Zeit führt, dafür das kein Kaffee gemacht wird. Wir haben den Timer auf das minimalsten Wert gesetzt bzw. machen den Vollautomaten direkt nach der Benutzung aus.

Es wird ja immer von Standby Geräten bzw. Netzteilstecker gesprochen die sich permanent am Strom befinden. Jedoch kann ich hier keinen erhöhten Energieverbrauch feststellen.

Was hier am meisten Sinn macht und zu einer erstaunliche Einsparung führt ist das Balkonkraftwerk. Daher sieht man in den Grafiken des öfteren das Der Stromzähler Watt Wert Null beträgt.

Das Projekt befindet sich noch in der Entwicklung, bei weiteren Fragen einfach schreiben.

Mycroft / PiCroft is an open source voice assistant.

Hardware required

  • Raspberry Pi
  • Display (in my case 5″Display)
  • JBL GO Bluetooth Speaker
  • Keyboard for setup

PiCroft first setup

PiCroft Setup

Connect JBL Go Bluetooth speaker

Install Pulseaudio-module-bluetooth

sudo apt-get install pulseaudio-module-bluetooth

Setup for setting bluetooth connection every startup at: /sudo nano /etc/rc.local

# Connect Bluetooth Speaker JBL Go
printf "### Connect Bluetooth Speaker ###"
echo "power on \nagent on \ndefault-agent \nconnect XX:XX:XX:XX:XX:XX \nquit" | bluetoothctl

This file needs to be edited at to get audio output: sudo nano /etc/mycroft/mycroft.conf

{
  "play_wav_cmdline": "aplay %1",
  "play_mp3_cmdline": "mpg123 %1",
  [...]
}

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

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;
}

Funny things that I wrote directly on the iPhone while waiting for ….

Some play games on their mobile phones in the waiting room, others read magazines. I discovered this great Widget IOS app called Scriptable for myself to bridge my boredom while waiting.

Although JacaScript is not my usual programming language, you get used to it quickly. This is of course also due to the fact that at the beginning you can always copy and paste a lot from other developers. But some parts of my code are also completely rewritten.

Strava – Last Ride – Current Month

With the scriptable widget, the last Stava training data can be called up as well as an overview of the last month. A nice feature is scrolling through friends’ training sessions like in the short video. All you have to do is set up several Strava widgets and slide them on top of each other. To get more Informations about that nice Scriptable Widget, check my blog entry about Strava Scriptable Widget. A similar Widget I have also created for Komoot.

How to add the scriptable code to your phone, check the end of this page 🙂

English for IT Vocabulary

Honestly, how often do we check our cell phones every day to check the news or other things. Many even unlock their cell phones every minute out of boredom. Why shouldn’t you learn something from it?
With the Scriptable widget, vocabulary from the IT area is displayed at a predetermined time interval.

Source Code can be downloaded here:
https://github.com/SmonSE/englishForIT

Chuck Norris Facts

At the beginning I looked for free Json Api’s with the following result: chucknorris.io is a free JSON API for hand curated Chuck Norris facts.

Chuck Norris Widget

Source Code can be downloaded here:
https://github.com/SmonSE/chucknorris.io

WordPress Latest Blog Post

Do you not feel like opening the page of your favorite blog every day to see if there is a new article. Then you can simply configure the wordpress blog script as a widget on your iPhone.

Source Code can be downloaded here:
https://github.com/SmonSE/IOS-Widget_load_JSON

How to add scriptable widget to the home screen

Regardless of which widget you have chosen, the setting procedure in iOS is always the same:

  1. First, add the copied code to a new script.
  2. With a tip on the controller icon at the very bottom in the left corner of the screen, you can give the script a meaningful name and select a suitable icon (glyph) for it.
  3. After that, switch to the widget screen by scrolling left on your home screens as long as possible.
  4. Tap and hold on this screen until the preset widgets start to wobble. You are now in edit mode. In this mode, tap on the plus sign in the upper left corner and scroll down to „Scriptable“ in the list that appears.
  5. Here you can still select the appearance and add the widget.
  6. Tap the Scriptable widget again while the icons are wobbling. Here you have the opportunity to select the appropriate script.
  7. To do this, tap on „Select“ in the „Script“ line, the app will show you all the scripts that have been created so far, which can now be selected. Then drag the widget to a location on the screen of your choice and exit edit mode.