hiho,
ich brauch mal wieder eure hilfe.
und zwar will ich mehrere werte eines devices in ein file schreiben. die sollen dann auch bei aktualisierung überschrieben werden.
am schönsten ein name und ein wert pro zeile oder sonst irgendwie 100% sicher erkennbar getrennt.
scheinbar gehts bei den vielen funden zu dem thema meistens um logfiles und dessen einlesen. zumindest find ich mal nix, was mir das schreiben zeigt.
kür wäre, wenn das ganze in einem doif gelöst werden könnte. da kann ich mir im gegensatz zu notifys und/oder dummys vielleicht dann sogar was dazu denken.
das verzeichnis in das geschrieben werden soll, gehört dem user fhem, sollte also kein problem sein.
die daten kommen aus einem httpmod-modul.
und bevor die frage aufkommt: ich will die daten dann in windows auslesen und weiter verwursten. mein tool, dass ich dafür unter win verwende kommt weder mit den rohdaten oder auch nicht mit mysql zurecht, fhem schon. also nehme ich diesen umweg *g*
Hey.
Zitat von: the ratman am 09 September 2020, 14:34:32
... oder auch nicht mit mysql zurecht...
Du hast die Daten schon in der DB? Kannst du dann nicht einfach eine SQL-Abfrage basteln und das Ergebniss in eine Datei schreiben.
https://mariadb.com/kb/en/select-into-outfile/
Fällt mir nur derade so auf :D
Oder per ftp Client direkt die readings abrufen. Geht auch gescriptet.
Oder eben ein schönes Array mit Perl bilden (push bzw. unshift) und dann FileWrite (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#FileWrite) nutzen...
Hier mal in einem at-Kontext (unschöner Mehrzeiler, sollte ich wohl bei Gelegenheit mal in myUtils auslagern und den Code modernisieren...):
define a_make_holiday at *23:30 {return undef unless($wday == 5);;\
\
#Ferienkalender\
my @holidaysraw = split(/\n/,(fhem 'get Familienkalender events format:custom="4 $T1 $T2 $S" timeFormat:"%m-%d" limit:count=10 filter:field(summary)=~".*[fF]erie.*"'));;\
my @holidays;;\
foreach (@holidaysraw) {\
unless ($_ =~ /[Ww]eihnacht/) {\
push (@holidays, $_);; \
} else { my @tokens = split (" ",$_);;\
my $lines = "4 $tokens[1] 12-31 $tokens[3]";;\
push (@holidays,$lines) if $month > 9;;\
$lines = "4 01-01 $tokens[2] $tokens[3]";;\
unshift (@holidays,$lines);;\
}\
} \
my $today = strftime "%d.%m.%y, %H:%M", localtime(time);;\
my $idstring = "# Created by at a_make_holiday on $today";;\
unshift (@holidays, $idstring);; \
my $filename ="./FHEM/ferien.holiday";;\
FileDelete($filename);;\
FileWrite($filename,@holidays);;\
\
#Mülltonnen\
my @tonnen = split(/\n/,(fhem 'get Familienkalender events format:custom="1 $T1 $S" timeFormat:"%m-%d" series:next limit:count=4 filter:field(summary)=~".*(Bioabfall|Restmuell).*"'));;\
unshift (@tonnen, $idstring);; \
$filename ="./FHEM/muell.holiday";;\
FileDelete($filename);;\
FileWrite($filename,@tonnen);;\
}
thx für die schnelle hilfe!
@darkness zu wenig dunst von. und nein, ich hab die daten noch nicht in mysql, aber das ginge ja mit fhem leicht.
@Frank_Huber dann müßte der ftp-client die daten wo hinschreiben und mein tool die daten dort auslesen. das dumme ding kann nicht viel mehr als von websites und textfiles daten lesen.
@Beta-User für nen nicht-perlianer irgendwie sehr verwirrend. falls du das also nochmal zufällig dau-freundlich wo rumliegen hast ...
Von Websites Daten lesen.
Warum holst es nicht so ab?
Fhem URL?get%20device%reading oder so ähnlich sollte dir den Wert liefern.
Proboer es mal im Browser aus.
...
FileDelete($filename);;\
FileWrite($filename,@holidays);;\
...
FileDelete sollte unnoetig sein.
@Frank_Huber
alter ... ich bin blöd ... falls mich noch wer zum notschlachten haben will, ich meld mich freiwillig.
du hast mir soeben gesagt, dass ich einfach das machen soll, was ich mit dem tool eh immer schon mach.
thx rudolfkoenig
für zukünftiges vorgemerkt.
😁😁😁😁
Passiert.
Notschlachtung nicht nötig.
Grüße vom Strand in Porto Garibaldi / Italien
😉
Und falls du doch einmal deine Daten in einer DB haben solltest sei der Hinweis gestattet, dass du sie mit einem DbRep:
set <> exportToFile <File>
ganz einfach mit entsprechenden Eingrenzungen über Attribute des Devices, Readings, des Zeitraums etc. direkt in ein CSV-File exportieren kannst. Tools können meist CSV Dateien als Input verarbeiten.
Beispiel siehe Anhang.
Zitat von: rudolfkoenig am 09 September 2020, 15:51:17
...
FileDelete($filename);;\
FileWrite($filename,@holidays);;\
...
FileDelete sollte unnoetig sein.
Danke für den Hinweis...
Ist einer meiner frühen Mehrzeiler, zwischenzeitlich sähe der deutlich anders aus ::) ...
Zitat von: the ratman am 09 September 2020, 15:35:34
@Beta-User für nen nicht-perlianer irgendwie sehr verwirrend. falls du das also nochmal zufällig dau-freundlich wo rumliegen hast ...
Ob es dau-freundlich ist, mußt du selbst entscheiden, aber zumindest gibt es eine "kommentierte Version":
https://forum.fhem.de/index.php/topic,85759.msg885883.html#msg885883
Evtl. sollte ich das mal überarbeiten, ist auch an anderen Stellen nicht mehr "state of the art", aber zumindest das Prinzip wird ggf. klarer...
@DS_Starter
bombiger hinweis ... DAS muß ich mir echt genauer anschauen. würde vieles einfacher machen.
Moin,
ich hoffe es ist nicht OT.
Wie handhabe ich denn Daten von solcher Größe am besten? Das wird momentan noch mit Python abgeholt und auch ausgewertet, was ich aber gerne direkt in FHEM handhaben möchte.
-rw-r----- 1 fhem fhem 344436 Sep 10 06:37 MOSMIX_L_2020091003_P0178.kml
Inhalt:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<kml:kml xmlns:dwd="https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<kml:Document>
<kml:ExtendedData>
<dwd:ProductDefinition>
<dwd:Issuer>Deutscher Wetterdienst</dwd:Issuer>
<dwd:ProductID>MOSMIX</dwd:ProductID>
<dwd:GeneratingProcess>DWD MOSMIX hourly, Version 1.0</dwd:GeneratingProcess>
<dwd:IssueTime>2020-09-10T03:00:00.000Z</dwd:IssueTime>
<dwd:ReferencedModel>
<dwd:Model dwd:name="ICON" dwd:referenceTime="2020-09-10T00:00:00Z"/>
<dwd:Model dwd:name="ECMWF/IFS" dwd:referenceTime="2020-09-09T12:00:00Z"/>
</dwd:ReferencedModel>
<dwd:ForecastTimeSteps>
<dwd:TimeStep>2020-09-10T04:00:00.000Z</dwd:TimeStep>
<dwd:TimeStep>2020-09-10T05:00:00.000Z</dwd:TimeStep>
snip....
<dwd:TimeStep>2020-09-20T10:00:00.000Z</dwd:TimeStep>
</dwd:ForecastTimeSteps>
<dwd:FormatCfg>
<dwd:DefaultUndefSign>-</dwd:DefaultUndefSign>
</dwd:FormatCfg>
</dwd:ProductDefinition>
</kml:ExtendedData>
<kml:Placemark>
<kml:name>P0178</kml:name>
<kml:description>BIEBESHEIM</kml:description>
<kml:ExtendedData>
<dwd:Forecast dwd:elementName="PPPP">
<dwd:value> 102130.00 102150.00 102170.00 102180.00 102210.00 102210.00 102190.00 102160.00 102110.00 102040.00 101980.00 101920.00 101870.00 101850.00 101850.00 101860.00 101870.00 101880.00 101890.00 101880.00 101870.00 101850.00 101820.00 101800.00 101790.00 101800.00 101830.00 101820.00 101820.00 101800.00 101760.00 101720.00
snip....
- - - - 61.00 - - - - - 61.00 - - - - - 1.00 - - - - - 1.00 - - - - - 1.00 - - - - - 1.00 - - - - - 1.00 - - - - - 1.00 - - - - - 61.00 - - - - - 61.00 - - - - - 1.00 - - - -</dwd:value>
</dwd:Forecast>
<dwd:Forecast dwd:elementName="WPcd1">
<dwd:value> - - - - - - - - - - - - - - - - - - - - 1.00 - - - - - - - - - - - 1.00 - - - - - - - - - - - 1.00 - - - - - - - - - - -
snip....
1.00 - - - - - - - - - - - 61.00 - - - - - - - - - - - 61.00 - - - - - - - - - - - 1.00 - - - - - - - - - - - 1.00 - - - - - - - - - - - 61.00 - - - - - - - - - -</dwd:value>
</dwd:Forecast>
</kml:ExtendedData>
<kml:Point>
<kml:coordinates>8.47,49.78,90.0</kml:coordinates>
</kml:Point>
</kml:Placemark>
</kml:Document>
</kml:kml>
Gruß
Christian
Zitatich hoffe es ist nicht OT.
Ich meine schon. Was genau meinst du mit "handhaben"? Dateien einlesen kann man in perl auch, zum Parsen von XML gibt es Bibliotheken, oder man pfuscht, und findet das Gesuchte per Regexp. Alternativ konfiguriert man HTTPMOD passend.
Zu FileWrite faellt mir noch etwas verspaetet ein: Achtung, bei Verwendung von configDb landen die Dateien in der DB.
Zitat von: rudolfkoenig am 10 September 2020, 09:56:29
Ich meine schon. Was genau meinst du mit "handhaben"? Dateien einlesen kann man in perl auch, zum Parsen von XML gibt es Bibliotheken, oder man pfuscht, und findet das Gesuchte per Regexp. Alternativ konfiguriert man HTTPMOD passend.
Okay, danke.
Ich versuche es dann mal mit HTTPMOD, das scheint mir passend zu sein.
Mit handhaben meine ich z.B. ein Reading von der Größe 344436 Byte in HTTPMOD einzulesen. Da scheint mir das Volumen etwas groß zu sein.
der vollständigkeit halber: sollte wer auch mit dremel 3d45 rumspielen und rainmeter haben:
noch unfertig, aber wer rainmeter kennt ...
der relevante rainmeter teil mit dem arbeitsstatus als grafik und %-anzeige des fortschritts. der rest kommt als mouseover popup, wenn man über den arbeitsstatus fährt.
[Measure_Dremel3D45]
Measure=Plugin
Plugin=WebParser.dll
URL=http://192.168.178.8:8083/fhem?cmd=jsonlist+dremel3d45+jobstatus+status+platform_temperature+buildPlate_target_temperature+temperature+extruder_target_temperature+chamber_temperature+door_open+fanSpeed+jobname+filament_type_+layer+message+zeit_gesamt+zeit_offen+zeit_vergangen+progress&XHR=1
RegExp=(?siU)"buildPlate_target_temperature": { "Value":"(.*)".*"chamber_temperature": { "Value":"(.*)".*"door_open": { "Value":"(.*)".*"extruder_target_temperature": { "Value":"(.*)".*"fanSpeed": { "Value":"(.*)".*"filament_type_": { "Value":"(.*)".*"jobname": { "Value":"(.*)".*"jobstatus": { "Value":"(.*)".*"layer": { "Value":"(.*)".*"message": { "Value":"(.*)".*"platform_temperature": { "Value":"(.*)".*"progress": { "Value":"(.*)".*"status": { "Value":"(.*)".*"temperature": { "Value":"(.*)".*"zeit_gesamt": { "Value":"(.*)".*"zeit_offen": { "Value":"(.*)".*"zeit_vergangen": { "Value":"(.*)"
UpdateRate=600
[Measure_buildPlate_target_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=1
[Measure_chamber_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=2
[Measure_door_open]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=3
[Measure_extruder_target_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=4
[Measure_fanSpeed]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=5
[Measure_filament_type_]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=6
[Measure_jobname]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=7
[Measure_jobstatus]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=8
[Measure_layer]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=9
[Measure_message]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=10
[Measure_platform_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=11
[Measure_progress]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=12
[Measure_status]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=13
[Measure_temperature]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=14
[Measure_zeit_gesamt]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=15
[Measure_zeit_offen]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=16
[Measure_zeit_vergangen]
Measure=Plugin
Plugin=WebParser
URL=[Measure_Dremel3D45]
StringIndex=17
################################################################################################################
[Status]
Meter=Image
MeasureName=Measure_jobstatus
ImageName=%1.png
X=189
Y=51
W=32
H=32
ToolTipTitle=weitere informationen
ToolTipType=1
ToolTipIcon=INFO
ToolTipText=[Measure_jobname]#CRLF##CRLF#erstberechnung: [Measure_zeit_gesamt] h#CRLF#noch: [Measure_zeit_offen] h#CRLF#vergangen: [Measure_zeit_vergangen] h#CRLF##CRLF#TEMPERATUREN:#CRLF##CRLF#nozzle: [Measure_temperature] °c von [Measure_extruder_target_temperature] °c#CRLF#bett: [Measure_platform_temperature] °c von [Measure_buildPlate_target_temperature] °c#CRLF#innenraum: [Measure_chamber_temperature] °c (ventilator: [Measure_fanSpeed])
DynamicVariables=1
[Fertig]
Meter=String
MeasureName=Measure_progress
X=5
Y=32
StringAlign=left
FontFace=Bahnschrift
FontColor=20,20,20
FontSize=12
AntiAlias=1
Text=fertig zu %1 %
und der httmod dazu:
define name httmod http://192.168.178.9/command 15
userReadings
zeit_vergangen { strftime('%H:%M',gmtime(ReadingsNum($NAME,"elaspedtime",0))) },
zeit_offen { strftime('%H:%M',gmtime(ReadingsNum($NAME,"remaining",0))) },
zeit_gesamt { strftime('%H:%M',gmtime(ReadingsNum($NAME,"totalTime",0))) }
wie gesagt - höchst unfertig, aber mit dem ganzen grafikzeugs von mir fängt eh kein andere was an.