Comments (8)
Hab da selbst was zusammenkopiert, scheint auf den ersten Blick zu funktionieren
# get last digit
read lastnibble <<< ${sensor_id:(-1)}
case $lastnibble in
0*) message="{ \"sensor_id\":\"$sensor_id\", \"temperature\":$temperature, \"humidity\":$humidity, \"lowbat\":$lowbat, \"rssi\":$rssi }";;
2*) message="{ \"sensor_id\":\"$sensor_id\", \"raincount\":$temperature, \"timediff\":$humidity, \"lowbat\":$lowbat, \"rssi\":$rssi }";;
esac
Abschließend
stateFormat Q: raincount t= timediff
from fhem-examples.
Hallo Malte,
ich vermute, dass die IDs Deiner Sensoren ein anderes Format haben als meine.
Meine Sensoren haben eine 4-stellige Hex-ID 15 Bit, bei denen keins der Zeichen eine spezielle Bedeutung hat, z. B. 5158
.
Du scheinst Sensoren einzusetzen, die keine feste ID haben und ein strukturiertes Format versenden, siehe Non-WeatherHub (TFA_2, TFA_3, TX22).
Um je nach Sensor-Typ eine andere JSON-Nachricht zu erzeugen, sollte im Shell-Skript zunächst der Aufbau der ID untersucht (15-Bit / WeatherHub / Format a000bccd
) und in Abhängigkeit davon eine passende Nachricht erzeugt werden. Wenn Du Dir eine entsprechende Erweiterung wünscht, kannst Du gern einen Pull Request im Git-Repository tfrec-mqtt aufmachen, wo der Code inzwischen gepflegt wird. Es wäre dabei sinnvoll, alle 3 bekannten Formate zu unterstützen.
Alternativ könnte man die Auswertung auch erst im Nachgang, also innerhalb von FHEM auf Basis des ID-Formates vornehmen. Die JSON-Nachricht wäre dann wie derzeit für alle Sensoren gleich (Properties temperature
und humidity
), und erst bei der Auswertung in FHEM würde ein passend benanntes Reading erzeugt (z.B. temperature
/ humidity
oder rain_count
/ duration
).
from fhem-examples.
Hallo,
so nach langer Zeit... bemerkt das es ein Dockerfile gibt. Sehr nett!
Mein Workaround passt dann nicht mehr:
- nicht "Updatesicher"
- und ich es auf anhieb nicht geschafft habe meine Änderungen mqtt-publish unterzumogeln
So wie "ich" es verstehe werden verschiedene TFA Geräte unterschieden anhand des letzten 4 Bit. Konkret enthält mein Regensensor quasi zwei Sender:
0865bcacdff1 2 : Regensensor
0865bcacdff1 0 : Temperatursensor der im Regensensor integiert ist
Jeder Sensortyp liefert aber unterschiedliche Daten. Ich würde gerne schon beim "absenden" Richtung MQTT die Bezeichner richtig haben, das ein "Regeninkrement (0,25 l/Tick) auch als z.B. Regencount erscheint und ich mir nicht merken muss das, weil die Begriffe nicht angepasst werden, Temperature im Falle des Regensensors eingetlich "regencount" meint.
In meinem Fall Regensensor hat der xxxx2 Sensor als Temperaturwert den Regen - Tick, und als humidity die Zeit seit dem letzten Puls. Was auch erstmal "nur" für Weatherhub gilt.. :-(
In FHEM wird die Regenmenge dann so summiert:
rain_total monotonic { ReadingsVal ("mqtt_klima_regensensor_regen", "raincount", 0)*0.25 },
Nebenfrage: Woher kommt das "plötzlich" in rauen Mengen?
localhost run-tfrec.sh[10918]: Warning: Unable to locate configuration directory, default config not loaded.
Ich bin mir keiner Schuld bewusst.
Hier noch der verunglückte Versuch es selbst zu ändern
build_json_message() {
[ ! "${#}" -lt "8" ] || cancel "too few arguments: '${@}'"
echo "${@}" | while read sensor_id temperature humidity seq lowbat rssi flags timestamp; do
# remove the leading '+' to get a valid JSON number
temperature="${temperature#+}"
read lastnibble <<< ${sensor_id:(-1)}
if [ "${FORMAT_JSON_LOWBAT_AS_BOOLEAN}" = 'true' ]; then
if [ "${lowbat}" -eq 1 ]; then lowbat='true'; else lowbat='false'; fi
fi
case $lastnibble in
0*) printf '{ "sensor_id":"%s", "temperature":%.9g, "humidity":%.9g, "seq":%i, "lowbat":%s, "rssi":%i, "flags":%i, "timestamp":%i }'
"${sensor_id}" "${temperature}" "${humidity}" "${seq}" "${lowbat}" "${rssi}" "${flags}" "${timestamp}" ;;
2*) printf '{ "sensor_id":"%s", "raincount":%.9g, "timediff":%.9g, "seq":%i, "lowbat":%s, "rssi":%i, "flags":%i, "timestamp":%i }'
"${sensor_id}" "${temperature}" "${humidity}" "${seq}" "${lowbat}" "${rssi}" "${flags}" "${timestamp}" ;;
esac
# printf '{ "sensor_id":"%s", "temperature":%.9g, "humidity":%.9g, "seq":%i, "lowbat":%s, "rssi":%i, "flags":%i, "timestamp":%i }'
# "${sensor_id}" "${temperature}" "${humidity}" "${seq}" "${lowbat}" "${rssi}" "${flags}" "${timestamp}"
done
}
from fhem-examples.
Anpassungen an mqtt-publish
Mein Workaround passt dann nicht mehr:
- und ich es auf anhieb nicht geschafft habe meine Änderungen mqtt-publish unterzumogeln
Du kannst das im Docker-Image integrierte Skript mqtt-publish
mit einer von Dir modifizierten Variante überschreiben, indem Du Deine Variante in den Container mountest, Beispiel siehe unten.
Warnungen im Log
Woher kommt das "plötzlich" in rauen Mengen?
localhost run-tfrec.sh[10918]: Warning: Unable to locate configuration directory, default config not loaded.
Diese Meldung wird von mosquitto_pub
ausgegeben, wenn die Umgebungsvariable HOME
fehlt (Details). Setze HOME
, um sie zu vermeiden.
Beispiel
Beide Punkte können durch Anpassungen an der docker-compose.yml
behandelt werden. Falls die Variante von mqtt-publish
den Namen custom-mqtt-publish
hat und neben der docker-compose.yml
liegt:
---
services:
tfrec-mqtt:
...
environment:
HOME: "/home"
...
volumes:
- "./custom-mqtt-publish:/usr/local/bin/mqtt-publish:ro"
from fhem-examples.
Irgendwie ist hier Dein letzter Kommentar verloren gegangen...
Im
read lastnibble <<< ${sensor_id:(-1)}
das<<<
wird nämlich nicht von/bin/sh
unterstützt. Somit muss ich mal schauen wie ich hier den niedrigsten Nibble bekomme
Oben wird beschrieben, dass der subtype
Werte von 0 bis 4 annehmen kann, dafür braucht man 3 Bit. Mit folgendem Code sollte es möglich sein, ohne Bash die letzten 3 Bit der Variable sensor_id
auf eine neue Variable subtype
zu schreiben:
subtype="$((${sensor_id##${sensor_id%%?}} % 8))"
Hilft Dir das weiter?
from fhem-examples.
Noch etwas kürzer wird es, wenn man das letzte Zeichen komplett auswertet, was laut der Doku oben auch zulässig sein dürfte:
subtype="${sensor_id##${sensor_id%%?}}"
from fhem-examples.
Hallo,
ja, hatte den Beitrag zurückgezogen weil mir doch etwas eingefallen war bzw. ich zuerst was anderes probieren wollte. Deine Variante, auch wenn ich diese nicht genau verstehe, ist einfacher als das was ich tue. Ich habe zuerst ein "echte" Hexwert gebaut und dann maskiert
# add 0x to the sensor ID to get a real hexvalue
var_hex=$(printf "%s%s" "0x" "$sensor_id")
# get the lowest byte value which indicates the sensor type
nibble=$(((($var_hex)) & 0xF));
case $nibble in
0*) printf '{ "sensor_id":"%s", "temperature":%.9g, "humidity":%.9g, "seq":%i, "lowbat":%s, "rssi":%i, "flags":%i, "timestamp":%i }' \
"${sensor_id}" "${temperature}" "${humidity}" "${seq}" "${lowbat}" "${rssi}" "${flags}" "${timestamp}";;
2*) printf '{ "sensor_id":"%s", "raincount":%.9g, "timediff":%.9g, "seq":%i, "lowbat":%s, "rssi":%i, "flags":%i, "timestamp":%i }' \
"${sensor_id}" "${temperature}" "${humidity}" "${seq}" "${lowbat}" "${rssi}" "${flags}" "${timestamp}";;
*) echo Oh, was unbekanntes;;
esac
Schein so erst einmal zu funktionieren. Also soweit, Danke!
from fhem-examples.
Deine Variante, auch wenn ich diese nicht genau verstehe, ist einfacher als das was ich tue.
Dann liefere ich gern eine kurze Erläuterung nach:
${sensor_id%%?}
schneidet das letzte Zeichen vonsensor_id
ab (genauer: den längsten Teilstring am Ende, der einem beliebigen Zeichen entspricht).${sensor_id##foo*}
schneidet am Anfang vonsensor_id
den längsten Text ab, auf denfoo*
passt.- In Summe ergibt das:
${sensor_id##${sensor_id%%?}}
schneidet den String "sensor_id ohne das letzte Zeichen" von der Variablesensor_id
ab. Es bleibt also nur das letzte Zeichen übrig.
Die Shell-Syntax zur Parameter-Manipulation wird hier beschrieben.
Schön, dass es funktioniert.
from fhem-examples.
Related Issues (2)
- Dankeschön! HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fhem-examples.