Neuigkeiten:

Am Sonntag den 8.12.2024 kann es ab ca. 8:00 Uhr zu kurzzeitigen Einschränkungen / Ausfällen bei den Diensten des FHEM Vereines kommen.
Die Server müssen mal gewartet und dabei neu gestartet werden ;)

Hauptmenü

Wetterdaten in APRS-Nachricht per TCP verschicken?

Begonnen von dl9sec, 05 Februar 2018, 15:37:12

Vorheriges Thema - Nächstes Thema

dl9sec

Hallo zusammen,

ich betreibe ein kleines FHEM-System mit dem ich hauptsächlich Sensordaten (Tempertauren, Luftfeuchte) sammle und anzeige.
Ich habe auch eine KS300 ELV-Wetterstation intergriert.
Die Daten der Wetterstation würde ich nun gerne zyklisch als APRS-Nachricht direkt an einen APRS-Server (siehe http://4x5mg.inphoto.co.il/2016/05/02/sending-information-aprs-server/) schicken. Hierzu muss vorher noch ein wenig Vorverarbeitung erfolgen (z.B. Umrechnung der Temperatur in Fahrenheit, diverse Regenmengen, usw.), dann kann die Nachricht zusammengebaut und verschickt werden.

Hat jemand sowas schon einmal gemacht und eventuell entsprechende Module programmiert?

Vielen Dank.

Gruß, Thorsten

dl9sec

Hallo zusammen,

ich habe mal ein bisschen weiter recherchiert und bin auf eine potenzielle Lösung gestoßen, bei der sich die Java-Apllikation javAPRSSrvr darum kümmert die Wetterdaten, die in einer Datei Wxnow.txt zyklisch zusammengefasst werden, als APRS-Nachricht an einen APRS-IS zu senden.

Damit ändert sich für mich die Fragestellung etwas:

Wie bekomme ich die Daten meiner KS300 vorverarbeitet aus FHEM heraus in eine Datei Wxnow.txt (siehe http://wiki.sandaysoft.com/a/Wxnow.txt)?

Ich habe leider keinerlei Erfahrung mit Perl selbst.
Vielleicht hat jemand den einen oder anderen Tipp oder Codeschnipsel...

Vielen Dank.

Gruß, Thorsten

dev0

Wenn alle notwendigen Werte (Readings) vorhanden sind, dann ein at oder notify definieren, dass die Werte in ein file schreibt.

https://www.google.de/search?q=perl+write+file
http://perldoc.perl.org/functions/open.html
https://fhem.de/commandref.html#perl (für die ReadingsVal Syntax)

ZitatIch habe leider keinerlei Erfahrung mit Perl selbst.
Das kannst Du ändern, wenn Du möchtest.

dl9sec

Zitat von: dev0 am 06 Februar 2018, 16:49:14
Wenn alle notwendigen Werte (Readings) vorhanden sind, dann ein at oder notify definieren, dass die Werte in ein file schreibt.

https://www.google.de/search?q=perl+write+file
http://perldoc.perl.org/functions/open.html
https://fhem.de/commandref.html#perl (für die ReadingsVal Syntax)
Vielen Dank. Schau ich mir an...

Zitat
Das kannst Du ändern, wenn Du möchtest.
Ja klar, mach ich ja auch. Allerdings ist auch meine Lebenszeit begrenzt und hilfreiche Hinweise in die richtige Richtung sparen einfach Zeit und Energie  ;)

magomme

Hallo dl9sec
hattest Du hier einen Erfolg ? Das Thema würde mich auch interessieren.
Grüsse

magomme

#5
Hab es jetzt selbst hinbekommen,
ich schreibe alle meine zu übertragenden Werte mit SingelFileLog in eine Datei.
define <name> SingleFileLog <filename> <regexp>
Dann lese ich die Werte aus den LogFiles und sende diese zum APRS Server.
#!/bin/bash
#Define login info
user=yourHAMSIGN
password=yourPasscode

#Define object user info
senduser=yourHAMSIGN

#Define APRS-IS server
server=austria.aprs2.net
port=14580

#Define station location
lat=xxxx.xxN
lon=xxxxx.xxE

#Read value from file
temp=$(head -n5 yourfile.txt|tail -n1)
hum=$(head -n5 yourfile.txt|tail -n1)
pres=$(head -n5 yourfile.txt|tail -n1)
#echo $temp $hum $pres

#Define data
comment="QTH"
data="$senduser>APN100,TCPIP*:=${lat}/${lon}-${comment} ${temp}°C ${hum}% ${pres}hPA"

#Authentication variable
aprsauth="user $user pass $password"

#Send data
printf "%s\n" "$aprsauth" "$data" | ncat --send-only $server $port

Dann noch alle zwei Minuten das Script ausführen. Fertig.
defmod TX_FHEMtoAPRS at +*00:02:00 { system("yourscript.sh") }

dl9sec

#6
Hallo magomme,

habe leider erst jetzt nach langer Zeit gesehen, dass auf meine Frage doch noch Reaktionen kamen.
Das Thema ist für mich jetzt wieder interesant geworden, zumal ich das Programm "aprs-weather-submit" gefunden habe, dass einem recht viel abnimmt.

Leider bekomme ich ein paar Sachen noch nicht so recht übereinander.
Könntest Du eventuell das "SingleFileLog" etwas genauer ausführen und wie dessen Inhalte dann aussehen?
Wie hängt das "SignleFileLog" mit "yourfile.txt" zusammen?

Vielen Dank.

Gruß, Thorsten

betateilchen

#7
Zitat von: dl9sec am 27 Oktober 2024, 09:23:04Könntest Du eventuell das "SingleFileLog" etwas genauer ausführen

Das Modul SingleFileLog ist in der commandref von FHEM beschrieben: https://commandref.fhem.de/#SingleFileLog

Zitat von: dl9sec am 27 Oktober 2024, 09:23:04und wie dessen Inhalte dann aussehen?

Leg Dir halt mal ein solches Logfile an und schau rein :)

Zitat von: dl9sec am 27 Oktober 2024, 09:23:04Wie hängt das "SignleFileLog" mit "yourfile.txt" zusammen?

Vermutlich ist 'yourfile.txt' einfach der Platzhalter für den von Dir für das Logfile tatsächlich gewählten Dateinamen. Daraus werden die aufgezeichneten Werte ausgelesen.

(Vermutlich wird auch 'yourscript.sh' nicht der tatsächliche Name des scripts sein.)



Vermutlich könnte man die Sache aber auch mit FHEM-eigenen Bordmitteln lösen, ohne einen Umweg über shell-scripte gehen zu müssen.

Kannst Du mal bitte ein vollständiges List der KS300-Wetterstation posten und dann noch die Daten, die an APRS geschickt werden sollen?

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dl9sec

#8
Hallo,

danke für die Antwort.

ZitatDas Modul SingleFileLog ist in der commandref von FHEM beschrieben: https://commandref.fhem.de/#SingleFileLog

Ja, ich kann schon auch lesen ;) Es gibt halt nirgends irgendwelche Beispiele.
Mich hätte der <regexp> interessiert und was am Ende tatsächlich im Logfile steht.

ZitatLeg Dir halt mal ein solches Logfile an und schau rein :)

Ja, es geht halt schonmal damit los, dass wenn ich ein SingleFileLog mit dem Namen "/opt/fhem/log/APRS-QFF.log" anlege, die Datei tatsächlich dann "APRS-QFF.log.rdy" heißt.
Keine Ahnung, warum das so ist.

Mein SingleFileLog hat immer nur eine einzige Zeile mit sich ändernden Werten.
Dazu passen irgendwie die "head"/"tail"-Kommandos nicht.

ZitatVermutlich ist 'yourfile.txt' einfach der Platzhalter für den von Dir für das Logfile tatsächlich gewählten Dateinamen. Daraus werden die aufgezeichneten Werte ausgelesen.

(Vermutlich wird auch 'yourscript.sh' nicht der tatsächliche Name des scripts sein.)

Vermutlich. Aber dann hätte ich nicht für die drei Variablen den gleichen Dateinamen erwartet, sondern für jede Variable einen eigenen.

ZitatVermutlich könnte man die Sache aber auch mit FHEM-eigenen Bordmitteln lösen, ohne einen Umweg über shell-scripte gehen zu müssen.

Bestimmt, wenn man weiß wie. Ich finde den Ansatz Readings in Dateien zu schreiben recht charmant, da ich mit der Bash wesentlich besser zurecht komme, als mit Perl.

ZitatKannst Du mal bitte ein vollständiges List der KS300-Wetterstation posten und dann noch die Daten, die an APRS geschickt werden sollen?

Leider ist die KS300 kaputt gegangen. Ich habe jetzt eine Bresser 5-in-1 und noch ein paar andere Sensoren, die mir entsprechende Werte liefern. Die muss ich mir irgendwie zusammenfummeln.
Ich kann die Infos bei Gelegenheit mal zusammenstellen.
Wundert mich eigentlich, dass es nicht schon längst ein eigenes FHEM-Modul gibt, um Wetterdaten fürs CWOP an irgend einen APRS-IS zu senden...

Gruß, Thorsten

betateilchen

#9
Grundsätzlich glaube ich, dass man dafür überhaupt kein Logfile und schon gar kein eigenes Modul braucht. Im Moment fehlt mir ein bisschen Zeit, um mir das näher anzuschauen. Vielleicht sieht das am nächsten Wochenende etwas entspannter aus, dann denke ich mal darüber nach.

Letztendlich geht es doch nur darum, aus ein paar reading-Werten einen String zusammenzubauen und den irgendwohin ins Internet zu schicken.



Zitat von: dl9sec am 27 Oktober 2024, 15:15:30Ja, es geht halt schonmal damit los, dass wenn ich ein SingleFileLog mit dem Namen "/opt/fhem/log/APRS-QFF.log" anlege, die Datei tatsächlich dann "APRS-QFF.log.rdy" heißt.
Keine Ahnung, warum das so ist.

Weil Du das Attribut "readySuffix" nicht auf den Wert 'none' gesetzt hast. Somit wird .rdy standardmäßig an den von Dir angegebenen Dateinamen angehängt.

Siehe commandref:

ZitatreadySuffix
The file specified in the definition will be created with the suffix .tmp and after the file is closed, will be renamed to the value of this attribute. Default is .rdy, specify none to remove the suffix completely.

Zitat von: dl9sec am 27 Oktober 2024, 15:15:30Mich hätte der <regexp> interessiert und was am Ende tatsächlich im Logfile steht.

Identisch zur regexp in FileLog, in Deinem Fall also eine regex, die auf das device KS300 triggert.

Zitat von: dl9sec am 27 Oktober 2024, 15:15:30Mein SingleFileLog hat immer nur eine einzige Zeile mit sich ändernden Werten.

Deshalb heißt es ja "SingleFileLog".

Das Format innerhalb der Datei kannst Du über ein entsprechendes Attribut selbst bestimmen, dort kannst Du also auch einen mehrzeiligen Eintrag schreiben.

Zitat von: dl9sec am 27 Oktober 2024, 15:15:30Leider ist die KS300 kaputt gegangen. Ich habe jetzt eine Bresser 5-in-1 und noch ein paar andere Sensoren, die mir entsprechende Werte liefern. Die muss ich mir irgendwie zusammenfummeln.

Wenn die Daten nicht aus einem einzigen device kommen, funktioniert das mit SingleFileLog ohnehin nicht mehr.



Zitat von: dl9sec am 27 Oktober 2024, 15:15:30Wundert mich eigentlich, dass es nicht schon längst ein eigenes FHEM-Modul gibt, um Wetterdaten fürs CWOP an irgend einen APRS-IS zu senden...

Naja, die Datenübertragung an APRS-IS ist ja nun keine typische Aufgabe einer Hausautomation.
Sowas mache ich völlig unabhängig von FHEM mit einem ESP8266.

73 & schönen Abend!
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: dl9sec am 27 Oktober 2024, 15:15:30Ich finde den Ansatz Readings in Dateien zu schreiben recht charmant, da ich mit der Bash wesentlich besser zurecht komme, als mit Perl.

Dann mach das doch komplett in bash, Du kannst doch aus der Shell problemlos beliebige readings aus FHEM abfragen. Stichwort: HTTPAPI
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dl9sec

#11
ZitatSowas mache ich völlig unabhängig von FHEM mit einem ESP8266.

Ja, so ein MiniWX mit ESP8266 und BME280 läuft bei mir auch gerade und liefert Luftdruck, Temperatur und Luftfeuchte.
Aber der muss leider zu Gunsten eines SIGNALduino-ESP32 weichen, damit ich meine Bresser 5-in-1 in FHEM einbinden kann.
Luftdruck messe ich sowieso noch an anderer Stelle, daher stehen mir auch noch zusätzlich Wind- und Regendaten zur Verfügung.
Also liegt es für mich nahe die APRS-WX-Daten aus FHEM heraus zu generieren...

Ich habe es jetzt folgendermaßen realisiert:

In der "fhem.cfg" lege ich für jeden relevanten Messwert ein "SingleFileLog" an:

# APRS-Data
define myAPRS.QFF SingleFileLog /opt/fhem/log/APRS-QFF.log myBME280:pressure-nn:.*
attr myAPRS.QFF readySuffix none
attr myAPRS.QFF room APRS-Daten

define myAPRS.T SingleFileLog /opt/fhem/log/APRS-T.log myBR5IN1:temperature:.*
attr myAPRS.T readySuffix none
attr myAPRS.T room APRS-Daten

define myAPRS.H SingleFileLog /opt/fhem/log/APRS-H.log myBR5IN1:humidity:.*
attr myAPRS.H readySuffix none
attr myAPRS.H room APRS-Daten

define myAPRS.WD SingleFileLog /opt/fhem/log/APRS-WD.log myBR5IN1:windDirectionDegree:.*
attr myAPRS.WD readySuffix none
attr myAPRS.WD room APRS-Daten

define myAPRS.WS SingleFileLog /opt/fhem/log/APRS-WS.log myBR5IN1:windSpeed_kmh:.*
attr myAPRS.WS readySuffix none
attr myAPRS.WS room APRS-Daten

define myAPRS.WG SingleFileLog /opt/fhem/log/APRS-WG.log myBR5IN1:windGust_kmh:.*
attr myAPRS.WG readySuffix none
attr myAPRS.WG room APRS-Daten

define myAPRS.RD SingleFileLog /opt/fhem/log/APRS-RD.log myRainDay:.*
attr myAPRS.RD readySuffix none
attr myAPRS.RD room APRS-Daten

define myAPRS.R1H SingleFileLog /opt/fhem/log/APRS-R1H.log myRainLast1Hours:.*
attr myAPRS.R1H readySuffix none
attr myAPRS.R1H room APRS-Daten

define myAPRS.R24H SingleFileLog /opt/fhem/log/APRS-R24H.log myRainLast24Hours:.*
attr myAPRS.R24H readySuffix none
attr myAPRS.R24H room APRS-Daten

Die Logs sind dann Einzeiler mit dem Wert des letzten Events nach folgendem Schema:

z.B. "APRS-QFF.log" (fünfspaltig):
2024-10-28 12:49:21 myBME280 pressure-nn: 1027.5

oder z.B. "APRS-RD.log" (aus berechneten Werten, vierspaltig):
2024-10-28 12:49:52 myRainDay 0

Alle 10 Minuten wird dann ein ausführbares Bash-Script "send-aprs-wx.sh" (Owner fhem:dialout) aufgerufen:
defmod myTX_FHEMtoAPRS at +*00:10:00 { system("/opt/send-aprs-wx.sh") }
attr myTX_FHEMtoAPRS room APRS-Daten

"send-aprs-wx.sh" sieht dann folgendermaßen aus:
#!/bin/bash

# Used to send cyclic weather data from FHEM to APRS/CWOP server

# aprs-weather-submit
# See https://colincogle.name/blog/aprs-weather-submit
#  and
# https://github.com/rhymeswithmogul/aprs-weather-submit
#
# -M --comment ["text"]
# -k --callsign [call-SSID]
# -I --server [text]
# -o --port [number]
# -u --username [call-SSID]
# -d --password [number]
# -n --latitude [-90°..90°]
# -e --longitude [-180°..180°]
# -A --altitude 378 [m]
# -T --temperature-celsius [°C]
# -c --wind-direction [° true north]
# -S --wind-speed [mph]
# -g --gust [mph]
# -r --rainfall-last-hour [inches]
# -p --rainfall-last-24-hours [inches]
# -P --rainfall-since-midnight [inches]
# -s --snowfall-last-24-hours [inches]
# -h --humidity [%]
# -b --pressure [mbar/hPa]
# -L --luminosity
# -X --radiation
# -F --water-level-above-stage
# -V --voltage
# -i --icon

# Define login info
u_username=YOURCALL-XX
d_password=YOURPASS

# Define object user info
M_comment="FHEM WX - YourQTH"
k_callsign=YOURCALL-XX

#Define APRS-IS server
I_server=euro.aprs2.net
o_port=14580

#Define station location
n_latitude=50.799167
e_longitude=10.615543
# Altitude not used, is mapped to comment data
A_altitude=1141

# Read values from files
#       Barometric pressure (QFF) [mBar/hPa]
#cat /opt/fhem/log/APRS-QFF.log.rdy
b_pressure=$(awk '{print $5 }' /opt/fhem/log/APRS-QFF.log)
#       Temperature [°C]
#cat /opt/fhem/log/APRS-T.log.rdy
T_temperature_celsius=$(awk '{print $5 }' /opt/fhem/log/APRS-T.log)
#       Humidity [%]
#cat /opt/fhem/log/APRS-H.log.rdy
h_humidity=$(awk '{print $5 }' /opt/fhem/log/APRS-H.log)
#       Wind direction [°]
#cat /opt/fhem/log/APRS-WD.log.rdy
c_wind_direction=$(awk '{print $5 }' /opt/fhem/log/APRS-WD.log)
#       Wind speed [km/h] -> [mph]
#cat /opt/fhem/log/APRS-WS.log.rdy
S_wind_speed=`echo "$(awk '{print $5 }' /opt/fhem/log/APRS-WS.log) / 1.609" | bc -l`
LC_NUMERIC="C" printf -v S_wind_speed "%0.2f" $S_wind_speed
#       Wind gust [km/h] -> [mph]
#cat /opt/fhem/log/APRS-WG.log.rdy
g_gust=`echo "$(awk '{print $5 }' /opt/fhem/log/APRS-WG.log) / 1.609" | bc -l`
LC_NUMERIC="C" printf -v g_gust "%0.2f" $g_gust
#       Rainfall since midnight [mm] -> [inch] (first convert to non-scientific notation)
#cat /opt/fhem/log/APRS-RD.log.rdy
LC_NUMERIC="C" printf -v fldummy "%0.10f" $(awk '{print $4 }' /opt/fhem/log/APRS-RD.log)
P_rainfall_since_midnight=`echo "$fldummy / 25.4" | bc -l`
LC_NUMERIC="C" printf -v P_rainfall_since_midnight "%0.3f" $P_rainfall_since_midnight
#       Rainfall last hour [mm] -> [inch] (first convert to non-scientific notation)
#cat /opt/fhem/log/APRS-R1H.log.rdy
LC_NUMERIC="C" printf -v fldummy "%0.10f" $(awk '{print $4 }' /opt/fhem/log/APRS-R1H.log)
r_rainfall_last_hour=`echo "$fldummy / 25.4" | bc -l`
LC_NUMERIC="C" printf -v r_rainfall_last_hour "%0.3f" $r_rainfall_last_hour
#       Rainfall last 24 hours [mm] -> [inch] (first convert to non-scientific notation)
#cat /opt/fhem/log/APRS-R24H.log.rdy
LC_NUMERIC="C" printf -v fldummy "%0.10f" $(awk '{print $4 }' /opt/fhem/log/APRS-R24H.log)
p_rainfall_last_24_hours=`echo "$fldummy / 25.4" | bc -l`
LC_NUMERIC="C" printf -v p_rainfall_last_24_hours "%0.3f" $p_rainfall_last_24_hours

echo "==="
echo "Called: aprs-weather-submit -I ${I_server} -o ${o_port} -m ${m_timeout} -u ${u_username} -d ${d_password} -M \"${M_comment}\" -k ${k_callsign} -n ${n_latitude} -e ${e_longitude}"
echo "                            -b ${b_pressure} -T ${T_temperature_celsius} -h ${h_humidity} -c ${c_wind_direction} -S ${S_wind_speed} -g ${g_gust} -P ${P_rainfall_since_midnight} -r ${r_rainfall_last_hour} -p ${p_rainfall_last_24_hours}"
echo ""

# Send APRS WX data (used aprs-weather submit git branch with "timeout" option
#       Debug output to console
#aprs-weather-submit -M "${M_comment}" -k $k_callsign -n $n_latitude -e $e_longitude -b $b_pressure -T $T_temperature_celsius -h $h_humidity -c $c_wind_direction -S $S_wind_speed -g $g_gust -P $P_rainfall_since_midnight -r $r_rainfall_last_hour -p $p_rainfall_last_24_hours
#       Full weather data to server
aprs-weather-submit -I $I_server -o $o_port -m $m_timeout -u $u_username -d $d_password -M "${M_comment}" -k $k_callsign -n $n_latitude -e $e_longitude -b $b_pressure -T $T_temperature_celsius -h $h_humidity -c $c_wind_direction -S $S_wind_speed -g $g_gust -P $P_rainfall_since_midnight -r $r_rainfall_last_hour -p $p_rainfall_last_24_hours
#       Reduced weather data to server
#aprs-weather-submit -I $I_server -o $o_port -m $m_timeout -u $u_username -d $d_password -M "${M_comment}" -k $k_callsign -n $n_latitude -e $e_longitude -b $b_pressure -T $T_temperature_celsius -h $h_humidity

Im oberen Teil werden ein paar statische Daten konfiguriert.
Danach werden die eigentlichen Daten aus den Logs geholt, gegebenenfalls noch umgerechnet (km/h in mph, mm in inch) und in Variablen geschrieben. Am Ende folgt der Aufruf von "aprs-weather-submit", um die Wetterdaten dann an den APRS-IS zu senden.

Läuft gerade einwandfrei parallel zu meinem MiniWX im Testbetrieb.
Danke für die Unterstützung.

Gruß, Thorsten

betateilchen

Für mich ist das einfach nur völlig absurd und ziemlich "von hinten durch die Brust ins Auge" ...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!