Howto: Write Tellstick sensor values directly to HA

http://karpero.mine.nu/ha

Moderators: tom_rosenback, Daniel, Telldus

Daniel
Posts: 315
Joined: Thu Jan 18, 2018 11:08 am

Howto: Write Tellstick sensor values directly to HA

Post by Daniel » Thu Jan 18, 2018 11:08 am

Hi all.
Today I suddenly realized how completely unnecessary it is to poll the output of tdtool every n:th minute for readings, when there's functionality in the telldus software to do things synchronously when things happen. I've now ditched my use of the scheduled weather parser and instead I put the below script in /usr/local/share/telldus/scripts/sensorevent. Works like a charm :D

(please note that this is Linux only. The script execution stuff isn't available for Windows)

Code: Select all

#!/bin/bash

declare -A whitelist=([oregon-2914-11-rainrate]=1
                    [oregon-2914-11-raintotal]=1
                    [fineoffset-temperature-1]=1
                    [fineoffset-temperature-167]=1
                    [fineoffset-temperature-248]=1)

timestamp=$(date +"%d %b %T")

extraarguments=""

case ${DATATYPE} in
    1)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}"
        ;;
    2)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-humidity"
        ;;
    4)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-rainrate"
        ;;
    8)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-raintotal"
        extraarguments="&calculatevalues=true"
        ;;
    16)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-winddirection"
        ;;
    32)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-windaverage"
        ;;
    64)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-windgust"
        ;;
esac


if [[ ${whitelist["$haid"]} ]] ; then

    echo "${timestamp} - ${haid} -> ${VALUE} " >> /tmp/tdsensor.log

    url="http://localhost/homeautomation/api.php?do=sensors/setValue&serial=${haid}&name=${haid}&value=${VALUE}${extraarguments}"

    wget --header='Accept-Language: sv' -qO- "${url}" &> /dev/null

fi
/Daniel

edit: Added name argument to url. Without it HA won't be able to create new sensors so it won't work if you haven't used the parser in before.

edit 2: Added whitelist function. Please note that you need to change the whitelisted sensors or you'll get my values ;-)
Also added an argument which makes HA calculate useful rain values per hour and day for those stupid raintotal sensors. For this you need svn version 1420 or higher though (but the extra argument won't break anything in earlier versions)
Senaste info och release om/av HomeAutomation hittas här http://karpero.mine.nu/ha
Latest info and release of HomeAutomation can be found here http://karpero.mine.nu/ha

aryan
Posts: 88
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by aryan » Thu Jan 18, 2018 11:08 am

Jag är dålig på shellscript men fick inte scriptet att funka på mitt system, en Raspberry som kör Debian “Jessie”.

declare med versal A ger ett felmedelande, det funkar med gement a.

Detta “event.sh” i /usr/local/share/telldus/scripts/sensorevent/ funkar (nästan):

Code: Select all

#!/bin/bash

whitelist[1]='fineoffset-temperature-203'
whitelist[2]='mandolyn-temperaturehumidity-31'

timestamp=$(date +"%d %b %T")

extraarguments=""

case ${DATATYPE} in
    1)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}"
        ;;
    2)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-humidity"
        ;;
esac

    echo "${timestamp} - ${haid} -> ${VALUE} " >> /tmp/tdlog.log

if [[ " ${whitelist[@]} " == " ${haid} " ]]; then
    # whatever you want to do when whitelist contains haid

    echo "${timestamp} - ${haid} -> ${VALUE} " >> /tmp/tdsensor.log

    url="http://localhost/HomeAutomation/api.php?do=sensors/setValue&serial=${haid}&name=${haid}&value=${VALUE}${extraarguments}"
    echo "${url} " >> /tmp/tdsensor.log

    wget "${url}" &> /dev/null

fi
Ett problem jag har kvar är att jag bara får in temperatur värde från min temperaturehumidity sensor men inga humidity värden.

Jag undrar nu egentligen om det inte skulle vara enklare att i ställe skicka sensorernas Rawdata

Code: Select all

Rawdata: class:sensor;protocol:mandolyn;id:31;model:temperaturehumidity;temp:20.2;humidity:36;
Rawdata: class:sensor;protocol:fineoffset;id:203;model:temperature;temp:20.0;
till en php (api) sida där man ta hand om sensordata/värderna?

/Aryan

Daniel
Posts: 315
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by Daniel » Thu Jan 18, 2018 11:08 am

Nja, tanken är att API:et ska vara generellt. Ett API som skulle ta emot den raw-strängen skulle ju bli väldigt specifikt för just Tellstick.

Anledningen till att du inte får in några humidity-värden är att du inte har whitelistat dem. Du behöver ha med fineoffset-temperature-203-humidity samt mandolyn-temperaturehumidity-31-humidity också i din whitelist. Kolla på http://karpero.mine.nu/ha/faq/, under frågan "What is the ID of my 433 sensor?".

/Daniel
Senaste info och release om/av HomeAutomation hittas här http://karpero.mine.nu/ha
Latest info and release of HomeAutomation can be found here http://karpero.mine.nu/ha

aryan
Posts: 88
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by aryan » Thu Jan 18, 2018 11:08 am

OK tack la till en rad i whitelist arrayen och mitt script:

Code: Select all

#!/bin/bash

whitelist[1]='fineoffset-temperature-203'
whitelist[2]='mandolyn-temperaturehumidity-31'
whitelist[3]='mandolyn-temperaturehumidity-31-humidity'
timestamp=$(date +"%d %b %T")

extraarguments=""

case ${DATATYPE} in
    1)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}"
        ;;
    2)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-humidity"
        ;;
esac

    # echo "${timestamp} - ${haid} -> ${VALUE} " >> /tmp/tdlog.log

if [[ " ${whitelist[@]} " =~ " ${haid} " ]]; then
    # whatever you want to do when whitelist contains haid

    echo "${timestamp} - ${haid} -> ${VALUE} " >> /tmp/tdsensor.log

    url="http://localhost/HomeAutomation/api.php?do=sensors/setValue&serial=${haid}&name=${haid}&value=${VALUE}${extraarguments}"
    # echo "${url} " >> /tmp/tdsensor.log

    wget  --header='Accept-Language: sv' -qO- "${url}" &> /dev/null

fi
Det som inte funkade sedan var att jag inte fick något i databasen genom api länken.

Kollade i HomeAutomation/api/sensors/setValue.php och tror att jag hittade felet i rad 23;

Code: Select all

if($_SESSION[CFG_SESSION_KEY]["userlevel"] > 1)
Userlevel är väll NULL när sidan anropas med wget?
ändrade rad 23 till:

Code: Select all

if(($_SESSION[CFG_SESSION_KEY]["userlevel"] > 1) OR ($_SERVER['SERVER_NAME'] === 'localhost'))
och nu får jag in sensorvärden i databastabellen.

/Aryan

Daniel
Posts: 315
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by Daniel » Thu Jan 18, 2018 11:08 am

aryan wrote:Userlevel är väll NULL när sidan anropas med wget?
Nja... Det går att slänga med username och password i klartext i anropet, men anrop som kommer ifrån localhost (127.0.0.x) ska klassas som lokala och därmed släppas in utan autentisering. Kan det möjligen vara så att du har ipv6 påslaget? I så fall visas nämligen localhost som något annat (inte i huvudet nu exakt vad) och inte 127.0.0.x och då funkar det inte med HA 3.3. Hittade den missen i höstas någon gång, så det är åtgärdat i senaste svn-versionen.

/Daniel
Senaste info och release om/av HomeAutomation hittas här http://karpero.mine.nu/ha
Latest info and release of HomeAutomation can be found here http://karpero.mine.nu/ha

aryan
Posts: 88
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by aryan » Thu Jan 18, 2018 11:08 am

Hej Daniel,

Tack för snabbt svar.

Ärlig talat har jag ingen aning om ipv6 är påslagen eller ej, inget jag har gjort aktiv vad jag kan minnas iaf. Testade sudo modprobe och fick inget sva.

Det jag vet med säkerhet är att jag fick ändra rad 23
från
if($_SESSION[CFG_SESSION_KEY]["userlevel"] > 1)
till
if(($_SESSION[CFG_SESSION_KEY]["userlevel"] > 1) OR ($_SERVER['SERVER_NAME'] === 'localhost'))
för att det ska funka.

Innan dess har jag provat att lägga till detta innan rad 23
echo 'userlevel = ';
var_dump($_SESSION[CFG_SESSION_KEY]["userlevel"]);
echo '<br>servername = ';
var_dump( $_SERVER['SERVER_NAME']);

anropade url med curl och fick då
userlevel = NULL
<br>servername = string(9) "localhost"

Mvh Aryan

Daniel
Posts: 315
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by Daniel » Thu Jan 18, 2018 11:08 am

Tror att om du kör typ ifconfig eller kanske "ip addr list" så borde du se om det finns några ipv6-adresser där.

Den lösningen vi har gjort är att i funktionen isIpLocal() (i functions.php) kollar vi numera inte bara om adressen börjar med 127 utan även om den är "::1" (vilket tydligen är ipv6-motsvarigheten).

/Daniel
Senaste info och release om/av HomeAutomation hittas här http://karpero.mine.nu/ha
Latest info and release of HomeAutomation can be found here http://karpero.mine.nu/ha

aryan
Posts: 88
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by aryan » Thu Jan 18, 2018 11:08 am

Tack!

Det stämde att jag hade ipv6 påslaget, det kan jag ha gjort när jag konfigurerade rpi som vpn tunnel.

Ändrade nu rad 735 i (HA root/)functions.php i function isIpLocal
från

Code: Select all

if(substr(getIpAddress(), 0, 4) == "127.") {
till

Code: Select all

if((substr(getIpAddress(), 0, 4) == "127.") OR (substr(getIpAddress(), 0, 3) == "::1")) {
och då funkar det med original php kod i
(HA root/)/api/sensors/setValue.php

/Aryan

PS det skrivs nu ungefär 4x fler rader i temps tabeller än när jag körde telldusduo parser var 5:e minut men jag har sedan tidigare gjort ett php script som dagligen rensar bort onödiga (dubletter) rader i temp tabellen. Därför blir det inte mkt mer än 40k rader i tabellen som har värden from december 2015.

Daniel
Posts: 315
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by Daniel » Thu Jan 18, 2018 11:08 am

aryan wrote:PS det skrivs nu ungefär 4x fler rader i temps tabeller än när jag körde telldusduo parser var 5:e minut men jag har sedan tidigare gjort ett php script som dagligen rensar bort onödiga (dubletter) rader i temp tabellen. Därför blir det inte mkt mer än 40k rader i tabellen som har värden from december 2015.
Ja, det kommer ju alltid ett värde direkt när sändaren skickar det nu. Om allt funkar som det ska så funkar det så att om det är ett antal avläsningar i rad som har samma värde så sparas bara den första och den sista (så man vet när det blev den temperaturen och när det slutade vara det). Dock är det ju generellt så att den fluktuerar lite upp och ner så det blir ganska mycket värden ändå.

/Daniel
Senaste info och release om/av HomeAutomation hittas här http://karpero.mine.nu/ha
Latest info and release of HomeAutomation can be found here http://karpero.mine.nu/ha

aryan
Posts: 88
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by aryan » Thu Jan 18, 2018 11:08 am

Ja iom att mina sensorer skickar temperatur med en tiondels grad precision blir det såklart många värden “kvar” ändå. En tänkbar lösning på det är att man skulle runda av temperaturer t ex på halva grader innan de skrivs in i tabellen.

Min rensfunktion som körs en gång varje natt med cron tar ändå bort dubbletter med avrundade temperaturvärden till hela grader som är äldre en en vecka gamla så det tar bort onödiga rader.
Last edited by aryan on Fri Jan 27, 2017 4:29 pm, edited 1 time in total.

aryan
Posts: 88
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by aryan » Thu Jan 18, 2018 11:08 am

Testade nu med

Code: Select all

if (substr($value, -2, 1) == '.') {
	$value = (round(5*$value))/5;
	}
i setValue.php och det verkar funka om man vill lagra temperaturvärden med en femtedels grad precision ( 19.6, 19.8 ) isf en tiondels grad precision ( 19.5, 19.6, 19.7, 19.8 ) .

Daniel
Posts: 315
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by Daniel » Thu Jan 18, 2018 11:08 am

Ja, det är ju vettigt. Känns ju egentligen inte som att man bryr sig så där jättemycket om det är 3,7 eller 3,8 minus :D

/Daniel
Senaste info och release om/av HomeAutomation hittas här http://karpero.mine.nu/ha
Latest info and release of HomeAutomation can be found here http://karpero.mine.nu/ha

hylsan
Posts: 158
Joined: Thu Jan 18, 2018 11:08 am
Location: skåne, sweden

Re: Howto: Write Tellstick sensor values directly to HA

Post by hylsan » Thu Jan 18, 2018 11:08 am

efter min uppgradering till 3.3.2 så får jag inte in mina sensorvärden, så tänkte göra slag i saken och köra in dem direkt genom APIet.
Får dock fel när jag försöker köra scriptet..

Code: Select all

pi@raspberrypi:/usr/local/share/telldus/scripts/sensorevent $ sudo sh read.sh
read.sh: 3: read.sh: Syntax error: "(" unexpected
Har inte direkt ändrat något så vet inte varför han gnäller, tycker det ser rätt ut...

aryan
Posts: 88
Joined: Thu Jan 18, 2018 11:08 am

Re: Howto: Write Tellstick sensor values directly to HA

Post by aryan » Thu Jan 18, 2018 11:08 am

Hur ser scriptet ut? Exemplet längst upp i tråden gav syntax error på min PI
declare -A whitelist bör vara declare -a whitelist och det gick inte helle bra att få värderna i arrayn på det sett som det görs i exemplet.


Om du testar att byta ut exempelvis

Code: Select all

declare -A whitelist=([oregon-2914-11-rainrate]=1
       [mandolyn-temperaturehumidity-31=1
       [mandolyn-temperaturehumidity-31-humidity]=1)
mot:

Code: Select all

declare -a whitelist # (denna declare array rad behövs troligtvis inte alls) 
whitelist[]='oregon-2914-11-rainrate'
whitelist[]='mandolyn-temperaturehumidity-31'
whitelist[]='mandolyn-temperaturehumidity-31-humidity'
borde det kunna funka

hylsan
Posts: 158
Joined: Thu Jan 18, 2018 11:08 am
Location: skåne, sweden

Re: Howto: Write Tellstick sensor values directly to HA

Post by hylsan » Thu Jan 18, 2018 11:08 am

nope :(

Code: Select all

pi@raspberrypi:/usr/local/share/telldus/scripts/sensorevent $ sudo sh read2.sh
read2.sh: 3: read2.sh: declare: not found
read2.sh: 4: read2.sh: whitelist[]=fineoffset-temperaturehumidity-151: not found
read2.sh: 5: read2.sh: whitelist[]=fineoffset-temperaturehumidity-151-humidity: not found
read2.sh: 6: read2.sh: whitelist[]=fineoffset-temperaturehumidity-135: not found
read2.sh: 7: read2.sh: whitelist[]=fineoffset-temperaturehumidity-135-humidity: not found
read2.sh: 8: read2.sh: whitelist[]=fineoffset-temperature-152: not found
read2.sh: 40: read2.sh: Bad substitution
pi@raspberrypi:/usr/local/share/telldus/scripts/sensorevent $
Så här ser scriptet ut i sin helhet;

Code: Select all

#!/bin/bash

declare -a whitelist
whitelist[]='fineoffset-temperaturehumidity-151'
whitelist[]='fineoffset-temperaturehumidity-151-humidity'
whitelist[]='fineoffset-temperaturehumidity-135'
whitelist[]='fineoffset-temperaturehumidity-135-humidity'
whitelist[]='fineoffset-temperature-152'

timestamp=$(date +"%d %b %T")

extraarguments=""

case ${DATATYPE} in
    1)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}"
        ;;
    2)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-humidity"
        ;;
    4)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-rainrate"
        ;;
    8)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-raintotal"
        extraarguments="&calculatevalues=true"
        ;;
    16)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-winddirection"
        ;;
    32)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-windaverage"
        ;;
    64)
        haid="${PROTOCOL}-${MODEL}-${SENSORID}-windgust"
        ;;
esac

if [[ ${whitelist["$haid"]} ]] ; then
    echo "${timestamp} - ${haid} -> ${VALUE} " >> /tmp/tdsensor.log
    url="http://localhost/ha/api.php?do=sensors/setValue&serial=${haid}&name=${haid}&value=${VALUE}${extraarguments}"
    wget --header='Accept-Language: sv' -qO- "${url}" &> /dev/null
fi

/Tomas

Post Reply