Montag, 13. April 2020

Make old S300TH sensors work with Home Assistant

Years ago the S300TH was one of the cheapest wireless temperature sensor you could buy. I managed to buy eight of them for 5 Euros a piece. Its broadcasting on the 868Mhz band and the batteries last for years. When switching from OpenHab to Home Assistant, integrating these sensors was the hardest part so far, since I could not find any HA support for S300TH, FS20 or similar.

In FHEM and OpenHab the sensors are integrated using the busware.de CUL USB-stick using the custom firmware CULFW (see step 1 for flashing the stick, I am using v1.44). After this, receiving data is as easy as listening to a serial stream from /dev/ttyACM0. This can be easily tested on your Mac or Linux computer, and is described in the CULFW Reference under "quicktest".

One data package comes in the form:   "KaaTTHTHH", where 
  • K is the code for S300TH,
  • aa is the device number
  • T is temperature, 
  • and H is humidity.
How to decode this was not entirely clear from the reference page, but this post helped:

H = line.charAt( 7 ) + line.charAt( 8 ) + "." + line.charAt( 5 );
T = line.charAt( 6 ) + line.charAt( 3 ) + "." + line.charAt( 4 );

Two example packages and its decoding:

K1122623436 => Sensor 1: T22.2 H34.6
K41106245E7 => Sensor 2: T21.0 H45.6


Now we have everything we need to integrate with home assistant.
We are going to use the HA serial sensor platform to listen to /dev/ttyACM0.

Add the following to your configuration.yaml to receveive the temperature values for sensor 0:




sensor:
  - platform: serial
    serial_port: /dev/ttyACM0
  

  - platform: template
    sensors:
      temperature_sensor0:
        friendly_name: Temperature Room 0
        unit_of_measurement: "°C"
        value_template: >
          {% if states('sensor.serial_sensor')[1] == '0' %}
          {{ (states('sensor.serial_sensor')[6] ~ states('sensor.serial_sensor')[3] ~ states('sensor.serial_sensor')[4]) | float / 10 }}
          {% else %}
          {{ states('sensor.temperature_sensor0') }}
          {% endif %}



Note, the decoding of the "6-4-3" pattern using templates. Also we have to decode the sensor device number and ignore all other sensors that are not "0". In this case we will just report the current value (line before endif). This is not a nice solution, sine it will create additional data points in the data base, but I haven't found a better solution yet.


To decode the other sensors, simply add a temperature_sensor1, etc. and change '0' to '1' and also return 'temperature_sensor1'. Add sensor entries for humiditiy accordingly.

After adding this code, you will notice, that nothing will happen. The reason is, that you first have to tell the CUL to report incoming packets. Unfortunately, the Home Assistant serial platform does not support sending, only receiving. Instead we will use a simple 'echo' shell command. Add the following to configuration.yaml:


shell_command:
  start_cul: "echo -e 'X21\x0a' > /dev/ttyACM0"



Now call this command from an automation action. Add the following to automation.yaml:

- id: '1586784995017'
  alias: Start CUL
  description: ''
  trigger:
  - minutes: /5
    platform: time_pattern
  condition: []
  action:
  - data: {}
    service: shell_command.start_cul


We could have used an even trigger "homeassistant" and only call the shell_command on start up, but I was not sure about the start up sequence (I guess, serial has to configure the connection parameters first).

This work smoothly for my seven sensors so far and saved me some money for buying newer (and fancier) sensors.

Donnerstag, 9. April 2020

Home Assistant with ESPEasy Switch and REST

I flashed a cheap Sonoff S20 power plug switch with ESPEasy years ago (see this blog post) and wanted to see how easy I could add this switch to my new Home Assistant environment.

The common way to control this from a home automation environment seems to be MQTT -  including all kind of problems. Since ESPEasy provides a simple REST api there must be a direct way to integrate the switch into Home Assistant.


Turning the switch on is a simple http GET call with the last number beeing 0 for off and 1 for on:


Reading the state is also simple:

First try was using the RESTful Switch from HA, but it expects the switch command to be a http POST. Unfortunately ESPEasy expects a GET command.

Finally, I used the command_line switch from HA in combination with simple curl calls. This is the working code from configuration.yam:


switch:

  - platform: command_line
    scan_interval: 5
    switches:
      connection_octoprint:
        friendly_name: "ESPEasy Switch"
        command_on: "curl http://192.168.178.63/control?cmd=GPIO,12,1"
        command_off: "curl http://192.168.178.63/control?cmd=GPIO,12,0"
        command_state: "curl http://192.168.178.63/control?cmd=status,GPIO,12"
        value_template: "{{ '\"state\": 1' in value }}"


And do not forget to add the following rule to your ESPEasy device (using the ESPEasy web interface):

On Button#State=1 do
  if [Relay#State]=0
    gpio,12,1
  else
    gpio,12,0
  endif
endon

This way the switch works in both directions: pressing the button on the device or by switching from HA - and the state is correctly displayed in HA and on the device using the LED. Note the delay of 5 seconds for showing the switch state in HA after pressing the device button. This is due to the polling interval. 

Switch in Home Assistant

Configuration of ESPEasy

Mittwoch, 3. April 2019

Abbau eines Medikaments

Eine kleine Simulation zum Abbau eines Medikaments im Tagesverlauf:
Annahmen:
- Einnahme um 7:00 und 14:00
- Dosis 7.5
- Halbwertszeit 19h
- Exponentieller Abbau
- Vollständige und instantane Aufnahme


Man erkennt eine Sättigung nach 3-4 Tagen.
Die Spanne in dem Bereich der Sättigung beträgt etwas 10.2, das sind 45% vom maximalen Wert.
Die Spanne ließe sich durch eine Einnahme im Abstand von 12h auf 34% minimieren, würde aber zu höheren Werten in der Nacht führen.  


Hier noch ein Zoom auf den Tagesverlauf in der Sättigung (nach 72h):

Man sieht die beiden Einnahmezeitpunkt um 7:00 und 14:00 und den langen Abfall über die Nacht.
Niedrige Werte zur Mittagspause und zur Schlafenszeit, perfekt ;-)
Alle Angaben ohne Gewähr!



Python Code:

import matplotlib.pyplot as plt
import numpy as np
import math

dose   = 7.5         # Dosis pro Tablette
lamb = 19.0 / 0.693  # Halbwertszeit -> Zeitkonstante in Stunden
hours = 144          # 5 days = 144 hours
p1 = 7               # 1. Tablette
p2 = 14             # 2. Tablette

d = np.zeros(hours)
for t in np.arange(1,hours,1):
    d[t] = d[t-1] * math.exp(-1/lamb)
    if t%24==p1 or t%24==p2:
        d[t] = d[t] + dose
   
lo = d[96+p1-1]
hi = d[96+p2]
span = hi - lo
perc = span / hi * 100
print("Spanne: ", span, " (",perc,"%)")

plt.plot( d )
#plt.plot( d[72:96+7] )
plt.xticks([0,24,48,72,96,120]
)


plt.xlabel('hours')
plt.ylabel('dose')
plt.ylim(0,25)
plt.show()



Samstag, 23. Dezember 2017

Sonoff S20 with EasyESP and OpenHAB and Alexa


I had some time and tried to make Alexa toggle the Sonoff S20 power switch that I recently bought  on Ebay for less than 20 Euro. It uses the well known ESP8266 WLAN chip. I have never tested the original firmware from Sonoff - I flashed it with EasyESP right away.

1. Flash S20 with Easy ESP Firmware 

There is a pretty good desciption that I followed:


I will not repeat everything, but just add some points. FIRST: Disconnect the 220V/110V power before opening the device and keep it disconnected also during the flashing procedure!! See the image for the pins, which were not labeled on my S20 board. Then connect VCC, RxD,TxD,GND to the same pins on your USB-Flash stick.

PINs of Sonoff S20
Now download EasyESP - I used the stable version R120. Note, that if you are on MacOS, like I am, you cannot use the provided batch file. The easiest solution for me was to use ESPTool.py. If you have python already installed,  simply enter "sudo pip install esptool" in you terminal window.

First, put the ESP into flash mode: hold the red button on the S20 board while connecting it to the USB-flash device. To write the firmware you have to first find out the name of your USB device. Look for a device named similar to /dev/tty.wchusbserialfd120. Then enter the following line: 

sudo esptool.py --port /dev/tty.wchusbserialfd120 write_flash 0x00000 ESPEasy_R120_1024.bin


Writing the firmware should only take a few seconds. Afterwards, the S20 will reboot and boot automatically into AP mode. Look for a WLAN called "ESP-0" and connect to it. It will ask for WPA password, enter "configesp". Open your browser and you will find a webpage where you can enter the SSID and password of your WLAN network. EasyESP will now try to connect - write down the IP it will display after is successfully connected. Then reboot and connect your computer to your home WLAN again. Enter the IP you just wrote down into your browser and you will get to the ESPEasy configuration webpage.
Flash USB-Programmer

See the above link on how to configure the GPIOs for your S20 in ESPEasy. After this, you should be able to switch power on/off using the button on the S20, and also using a simple web command (replace the IP with your S20 IP):


No worry if the button does not seem to work correctly - between two button presses you have to pause for about 2 seconds (I am not sure why). 

2. Configure Openhabian
Most people suggest to use an MQTT server to bind your ESPEasy device to your OpenHAB server. I found a simpler way by simply using the HTTPBinding in OpenHAB.  So, first install the HttpBinding in OpenHab, then add the following item to your default.items file:

Switch powerSwitch "Power Switch" ["Switchable"] {http=">[ON:POST:http://192.168.178.101/control?cmd=GPIO,12,1] >[OFF:POST:http://192.168.178.101/control?cmd=GPIO,12,0]"} 
Also add this to your default.sitemap file:

Switch item=powerSwitch label="Power Switch" 

You should now be able to switch the S20 Power Plug from OpenHab, using the OpenHAB Basic UI.

3. Bind to Alexa

There is an official OpenHAB-Skill for Alexa - however, I was not able to make it work. Instead I used the Hue-emulation service that comes with OpenHAB. Simply set the["Switchable"] tag on your item and it will appear in the Alexa app,  after you search for new devices for your Smart Home. You may now use an Alexa command to switch on your power plug.





Samstag, 10. Dezember 2016

Lautsprecherbau "Visaton Portrait" - Teil #2

Für die Weiche wird sowohl in die Schallwand eine Vertiefung gefräst (ganze Platine, 2mm) als auch in die Rückwand (nur für die Kondensatoren, 5mm). Die Platine wird auf der Schallwand mit viel Heißkleber befestigt, damit später nichts schnarrt. Die einzelnen Bauteile habe ich auch noch zusätzlich mit Heißkleber fixiert.


Um die Boxen aufzuhängen werden zwei Löcher in die Rückwand gebohrt. Wie die Löcher abgedichtet werden wurde von K&T nicht weiter beschrieben. In einigen Forenbeiträgen wird erwähnt, dass eine kleine Undichtigkeit der Box nicht weiter schadet. Trotzdem habe ich mir eine einfache Lösung ausgedacht (natürlich nur um weiter mit meiner neuen Oberfräse spielen zu können): Einfach in einen Holzknopf (ca. 15mm dick) ein Vertiefung fräsen, die ca. 10mm tief und etwas größer ist als ein Schraubenkopf. Diesen Knopf dann von innen auf das Loch der Box leimen. Die Box ist dicht und die Schraube hat im Loch eine Kante an der sie sich festklammern kann. 


Bespannt haben wir die Boxen erstmal mit weißem Boxenstoff. Von dem Akt der Bespannung gibt es leider keine Bilder - wir brauchten alle vier Hände um den Stoff einigermaßen gerade auf die Latten zu tackern. Neben den Fräsarbeiten sicherlich der anspruchsvollste Teil des Projektes. Vor dem Bespannen wurde der Rahmen noch schwarz gesprüht, damit sich der Untergrund nicht vom Rest der Box unterscheidet und durchschimmert. Danke Nadine!


Lautsprecherbau "Visaton Portrait" - Teil #1


Für unser neues Wohnzimmer suchte ich Lautsprecher die einerseits einen sehr guten Klang haben, andererseits möglichst keine Stellfläche udn vor allem keine Angriffsfläche für unsere Kinder bieten.

Die Zeitschrift Klang & Ton veröffentlichte 2005 das Projekt "Visaton Protrait".
Die Idee einen Lautsprecher komplett unsichtbar als Bilderrahmen getarnt zu bauen fand ich sehr fasziniered. Alle Materialien und die Ausgabe des Heftes sind hier zu finden.

Die Leisten und die Abstandshalter werden direkt auf die Rückwand geklebt. Die mittleren Abstandshalter der unteren Reihe habe ich etwas versetzt, damit die Schrauben später nicht in der Aussparung für den Lautsprecher sitzen.








Die Öffnungen für die beiden Lautsprecher werden mit der Oberfräse gefräst. Im Prinzip ginge das Freihand, da die Schallwand später unter der Abdeckung verschwindet. Sauberer geht es mit einem selbstgebauten Fräszirkel: die Oberfräse auf eine Latte schrauben (der Fräser guckt durch ein Loch in der Latte) und im korrekten Abstand zum Fräser (Radius des zu fräsenden Loches) eine Achse in Form einer Schraube anbringen. Diese Schraube geht dann durch ein Loch im Mittelpunkt des zu fräsenden Kreises in der Schallwand. Beim Herstellen des Fräszirkels hilft die Oberfräse - toll: eine Rekursion.

In der Schallwand zuerst die Vertiefung (großer Kreis) fräsen, dann den inneren Kreis ganz durch die Schallwand fräsen - andersherum geht es nicht weil sonst kein Zentrierloch mehr da ist ;-).
In die Rückwand wird zusätzlich eine 5mm Vertiefung für den hinteren Teil des Mitteltöners gefräst. Auf dem Bild sieht man noch das Loch für den Fräszirkel. Diese Loch wird am Ende mit einem Klecks Holzspachtel einfach wieder verschlossen, damit die Box dicht ist. 

Die Vertiefung für den Hochtöner wird freihand oder über einen Parallelanschlag gefräst. Der Runde Fräsekopf gibt automatisch abgerundete Ecken.

 

Einbau eines Autoradios in den VW T5.1 Caravelle


Da die meisten Beiträge zu diesem Thema eher verwirren als helfen, hier kurz eine einfache Lösung die definitiv funktioniert. In diesem Fall wurde das Pioneer MVH-AV280BT in einem T5.1 Caravelle von 2007 verbaut.

Zum Anschluß braucht ihr einen VW zu DIN Adapter wie diesen:
https://www.amazon.de/dp/B01CBT5D2M/ref=pe_386171_38075861_TE_item
Dort ist die Phantomspeisung für die Radio-Antenne gleich dabei.

Ein Problem bleibt: An den Steckern für das Original VW-Radio gibt es leider kein Zündungsplus, d.h. das neue Radio merkt nicht, in welcher Position der Zündschlüssel ist.
Weiß der Himmel was VW sich dabei gedacht hat, wahrscheinlich wollen sie einfach ihre überteuerten Radios verkaufen. D.h. ihr müsst das rote Kabel des Radios an irgendeiner anderen Stelle im Auto mit dem Zündungssignal verbinden.

Das Zündungsplus-Signal könnt ihr zum Beispiel am oberen Sicherungskasten direkt unter dem Getränkehalter abgreifen. Die Position der korrekten Sicherung findet ihr hier:
http://www.t5-wiki.de/wiki/Sicherungshalter
SB19 wird dort als "Radio-Dauerplus" bezeichnet, aber keine Sorge, es macht genau das was ihr wollt. Es lässt sogar das Radio laufen wenn der Motor abgestellt wird - solange bis der Schlüssel abgezogen wird. So kann man z.B. zu Ende telefonieren ohne den Motor laufen zu lassen, auch wenn man angekommen ist.

Ihr habt drei Möglichkeiten SB19 abzugreifen:
  1. Den Sicherungskasten ausbauen (war mir zu aufwändig).
  2. So einen Adapter benutzn: https://www.amazon.de/Kram-mini-Flachsicherungsadapter-Spannungsabgriff-Flachsicherungen/dp/B00274EH6K (hatte ich gerade nicht da ;-)
  3. Mit einem Dremel ein Kabel direkt an eine Mini-Flachsicherung löten und mit Heißkleber isolieren.
Hier sind ein paar Fotos meiner Bastellösung.
Erst die Seite der Flachsicherung vorsichtig mit dem Dremel abschleifen bis der Kontakt blank liegt:



Dann ein Kabel anlöten:

Mit Heißkleber isolieren, und überschüßigen Kleber mit dem Dremel wieder entfernen:

Beim Einbau darauf achten, dass das Signal NACH der Sicherung abgegriffen wird, das Kabel muss also den unteren Kontakt abgreifen. Im Zweifel mit dem Multimeter nachmessen, an welchem Kontakt (ohne eingebaute Sicherung) Spannung liegt und dann den anderen benutzen:


Das fertig eingebaute Radio: