RasPySpindel – Ein eigener Server für die iSpindel

Die direk­te Anbin­dung der iSpin­del an Ubi­dots lässt nor­ma­ler­wei­se kaum Wün­sche offen. Jedoch hat eine rei­ne Online‐​Lösung nicht nur Vor­tei­le. Durch schwa­che WLAN‐​Verbindungen, eine gestör­te Inter­net­an­bin­dung, War­tungs­ar­bei­ten oder Last­spit­zen beim Online‐​Anbieter kön­nen gesen­de­te Mess­punk­te der iSpin­del unwi­der­ruf­lich ver­lo­ren gehen. Wei­ter­hin sind der Betrieb von mehr als einer iSpin­del und die Nut­zung der Benach­rich­ti­gungs­funk­tio­nen bei Ubi­dots nicht kos­ten­frei. Die Daten wer­den auf Ser­vern im Inter­net gespei­chert, die nicht unter unse­rer Kon­trol­le ste­hen.

Ein eigener Server

So ent­stand recht schnell der Wunsch nach einer eige­nen, dedi­zier­ten Open‐​Source‐​Serverlösung, die wahl­wei­se im Heim­netz­werk oder sogar – auch zusätz­lich – auf einem ange­mie­te­ten (vir­tu­el­len) Host betrie­ben wer­den kann. Der loka­le „RasPySpindel‐​Server” kann Online­diens­te wie Ubi­dots wahl­wei­se erset­zen oder die Nut­zungs­mög­lich­kei­ten für die iSpindel‐​Daten durch zusätz­li­che Fea­tures abrun­den. Er ermög­licht eine kon­sis­ten­te Auf­zeich­nung der Mess­punk­te, auch ohne akti­ve Inter­net­ver­bin­dung, und ver­ur­sacht kei­ne Nut­zungs­ge­büh­ren beim Ein­satz meh­re­rer iSpin­deln.

Durch sei­ne offe­ne Archi­tek­tur erlaubt der „RasPySpindel‐​Server” unter ande­rem auch das selek­ti­ve Wei­ter­lei­ten von lokal emp­fan­ge­nen Daten an Ubi­dots und bie­tet dem Anwen­der somit die Mög­lich­keit, das Bes­te aus zwei Wel­ten zu nut­zen. Eine Anbin­dung an wei­te­re Diens­te kann sehr leicht imple­men­tiert wer­den.

Eine wich­ti­ge Anfor­de­rung war, die­se Lösung mög­lichst platt­form­un­ab­hän­gig zu gestal­ten, sodass die­se grund­sätz­lich auf jedem belie­bi­gen Rech­ner, der 24/​7 erreich­bar ist, ohne Pro­ble­me zum Lau­fen gebracht wer­den kann. Die Wahl der ver­wen­de­ten Spra­che fiel also auf Python 2.7, das auf jedem aktu­el­len Betriebs­sys­tem ohne grö­ße­ren Auf­wand ver­füg­bar ist, ob es sich nun um eine modi­fi­zier­te Fritz‐​Box, einen Windows‐​Rechner oder ein Mac OS X oder ande­res Unix-(Linux/BSD-)basiertes Sys­tem han­delt, und gera­de im Hin­blick auf die­se Auf­ga­be sehr kom­for­ta­ble Mög­lich­kei­ten bie­tet, ohne gro­ße Hür­den bei der Suche nach unver­meid­li­chen Feh­lern.

Server‐​Hardware

Weit ver­brei­tet im Heim­be­reich sind vor allem Mac Mini und Raspber­ry Pi. Letz­te­rer besticht durch gerin­ge Anschaf­fungs­kos­ten und mini­ma­len Platz‐ und Ener­gie­be­darf. Kaum grö­ßer als eine Ziga­ret­ten­schach­tel und für sich allein auch nicht teu­rer als zwei bis drei davon, ver­braucht die­ses Gerät zwi­schen 1,2 und 3 Watt Ener­gie, ver­fügt dabei aber über einen Quad‐​Core‐​Prozessor. Ein durch­ge­hen­der Betrieb wird also in der jähr­li­chen Strom­rech­nung kaum auf­fal­len.

Das aktu­el­le Modell der drit­ten Genera­ti­on bringt ein­ge­bau­tes WLAN und Blue­tooth mit, ver­fügt über vier USB-2.0-Anschlüsse, HDMI, Ether­net und einen Audio‐​Ausgang. Optio­nal ist auch ein Touch‐​Display erhält­lich. Die­ses ist aber eher „nice to have” und in kei­ner Wei­se nötig.

Raspberry Pi im FLIRC-Gehäuse

So wie im Foto rechts sieht der „Him­beer­ku­chen” typi­scher­wei­se aus. Das vom Autor emp­foh­le­ne FLIRC‐​Gehäuse sorgt auch für pas­si­ve Küh­lung.

Eine stän­dig wach­sen­de Zahl von Betriebs­sys­te­men, dar­un­ter sogar Win­dows 10 in der IoT‐​Version, aber auch ver­schie­de­ne „Fla­vors” von Linux machen es extrem viel­sei­tig. Zudem kann es sogar als WLAN‐​Repeater bzw. „Access Point” ein­ge­setzt wer­den, da die Emp­fangs­qua­li­tät des ein­ge­bau­ten Moduls sehr stark ist; die­ses bewährt sich hier bis­lang mit Bra­vour und über­trifft sogar teu­re­re Repea­ter in punc­to Reich­wei­te.

Die emp­foh­le­ne Standard‐​Installation für den eige­nen loka­len iSpindel‐​Server bezieht sich daher auf den Raspber­ry Pi 3 mit Raspbi­an als Betriebs­sys­tem, das stark an das weit­ver­brei­te­te Debian‐​Linux ange­lehnt ist, ste­tig wei­ter­ent­wi­ckelt wird und eine rie­si­ge Viel­falt an instal­lier­ba­ren Soft­ware­pa­ke­ten mit­bringt, sodass das Gerät durch­aus gleich­zei­tig für vie­le ver­schie­de­ne Auf­ga­ben inklu­si­ve Multimedia‐​Server, Heim­au­to­ma­ti­sie­rung und vie­les mehr genutzt wer­den kann – neben der Haupt­auf­ga­be, den iSpindel‐​Server zur Ver­fü­gung zu stel­len.

Aber auch auf ande­ren Gerä­ten, allen vor­an Mac OS X, stellt die Instal­la­ti­on kein gro­ßes Hin­der­nis dar; das Apple‐​Betriebssystem basiert letzt­lich auch auf Unix, halt nur nicht Linux, son­dern BSD. Ein Mac Mini fin­det sich in vie­len Haus­hal­ten bereits als Medi­en­ser­ver.

Software

Die Soft­ware befin­det sich momen­tan noch in einem frü­hen Sta­di­um. Sie ist in vie­le Rich­tun­gen erwei­ter­bar (vor allem die Benut­zer­freund­lich­keit), deckt aber bereits die für uns Hob­by­brau­er wich­tigs­ten Berei­che ab.

Das Kern­stück ist das in Python geschrie­be­ne eigent­li­che Ser­ver Skript. Es nimmt die Daten der iSpin­del als TCP Paket ent­ge­gen. Anders als bei direk­ter Ubi­dots Anbin­dung ist hier also kein umständ­li­cher Ver­bin­dungs­auf­bau nötig; die iSpin­del schickt die Daten ab und legt sich sofort wie­der schla­fen, was schon mal ganz von sel­ber für mit­un­ter deut­lich höhe­re Bat­te­rie­lauf­zei­ten sorgt (ein net­ter Neben­ef­fekt).

Was nun mit den emp­fan­ge­nen Daten pas­siert, ist kon­fi­gu­rier­bar. Die­se kön­nen als CSV Datei (eine ein­fa­che Text­da­tei, mit den ein­zel­nen Para­me­tern durch Kom­ma­ta oder Semi­ko­la getrennt, jeder Vor­gang in einer Zei­le) gespei­chert wer­den.

Wei­ter­hin kön­nen die Daten in einer (MyS­QL) Daten­bank abge­legt wer­den. Eben­so ist es mög­lich, die­se direkt an Ubi­dots oder ande­re Diens­te wei­ter­zu­lei­ten. Schließ­lich las­sen sich auch meh­re­re Instan­zen des Skripts „in Rei­he“ ansteu­ern, um z.B. Distan­zen über meh­re­re Heim­net­ze zu über­brü­cken oder auch aus der Fer­ne über einen zusätz­li­chen eige­nen (nor­ma­ler­wei­se gemie­te­ten) Ser­ver zugrei­fen zu kön­nen, ohne dabei das Heim­netz zu gefähr­den.

Die Kon­fi­gu­ra­ti­on erfolgt momen­tan noch direkt im Skript selbst (Datei iSpindle.py):

# General
 DEBUG = 0 # Set to 1 to enable debug output on console
 PORT = 9501 # TCP Port to listen to
 HOST = '0.0.0.0' # Allowed IP range.

# CSV
 CSV = 0 # Set to 1 if you want CSV (text file) output
 OUTPATH = '/home/pi/iSpindel/csv/' # CSV output file path; filename will be name_id.csv
 DELIMITER = ';' # CSV delimiter (normally use ; for Excel)
 NEWLINE='\r\n' # newline (\r\n for windows clients)
 DATETIME = 1 # Include Timestamp (Excel compatible)

# MySQL
 SQL = 1 # 1 to enable output to MySQL database
 SQL_HOST = '127.0.0.1' # Database host name (default: localhost)
 SQL_DB = 'iSpindle' # Database name
 SQL_TABLE = 'Data' # Table name
 SQL_USER = 'iSpindle' # DB user
 SQL_PASSWORD = 'ohyeah' # DB user's password (change this)

# Ubidots (using existing account)
 UBIDOTS = 1 # 1 to enable output to ubidots
 UBI_USE_ISPINDLE_TOKEN = 1 # 1 to override token by iSpindle Config Value
 UBI_TOKEN = '*****************' # global ubidots token

# Forward to public server or other relay (i.e. another instance of this script)
 FORWARD = 0
 # FORWARDADDR = 'ispindle.de'
 # FORWARDPORT = 9501
 FORWARDADDR = '192.168.2.21'
 FORWARDPORT = 9501

Natür­lich muss nun auch die iSpin­del selbst ent­spre­chend ein­ge­rich­tet wer­den, damit sie mit dem Ser­ver Skript erfolg­reich kom­mu­ni­ziert. Das Script ist natür­lich so aus­ge­legt, dass es belie­big vie­le (auch gleich­zei­tig ein­ge­hen­de) Ver­bin­dun­gen behan­deln kann.

Hier­zu gibt es im Kon­fi­gu­ra­ti­ons­me­nü unter „Ser­vice Type“ die Opti­on „TCP“:

Join-Dialog

Unter „Token“ kann ein Ubi­dots Token oder ein frei­er Kom­men­tar (mit füh­ren­dem * Zei­chen, damit die­ser igno­riert wird) ein­ge­tra­gen wer­den.
Somit ist es mög­lich, inner­halb eines Netz­werks ver­schie­de­ne Ubi­dots Kon­ten zu ver­wen­den (Nut­zungs­be­din­gun­gen beach­ten!) bzw. nicht alle iSpin­deln auto­ma­tisch auch an Ubi­dots wei­ter­zu­lei­ten, um nicht unnö­tig Ubi­dots „Credits“ zu ver­schwen­den. (So man­ches Ubi­dots Kon­to war plötz­lich leer, weil man ver­schie­de­ne iSpin­deln getes­tet und dabei nicht dar­an gedacht hat, dass jede ein­zel­ne am Kon­to „saugt”.)

Unter „Ser­ver Address“ wird die IP Num­mer des Rech­ners ein­ge­tra­gen, auf dem das Python Ser­ver Skript läuft (also die des Raspber­ry Pi in unse­rem Fall). Die Port Num­mer wird auf 9501 ein­ge­stellt (bzw. auf den­sel­ben Wert wie oben im Skript unter „Gene­ral“ kon­fi­gu­riert; 9501 ist nor­ma­ler­wei­se frei und soll­te also auch typi­scher­wei­se nicht ver­än­dert wer­den).

Visualisierung

Für die Visua­li­sie­rung der Daten gibt es nun vie­le ver­schie­de­ne Mög­lich­kei­ten, je nach den eige­nen Fähig­kei­ten und Vor­lie­ben. Excel Fans kön­nen über CSV Datei­en oder ODBC Schnitt­stel­le zur Daten­bank nach Her­zens­lust eige­ne Dia­gram­me anle­gen.

Eine wei­te­re, sehr ele­gan­te und fle­xi­bel kon­fi­gu­rier­ba­re Lösung bie­ten auch die Pro­gram­me „Plot 2“ für Mac OS X, sowie „Daviz“ für iOS, bei­de von Micha­el Wese­mann. Er ist selbst Hob­by­brau­er und iSpin­del Benut­zer; sei­ne Visua­li­sie­rungs Tools haben seit den spä­ten 80er Jah­ren des letz­ten Jahr­hun­derts eine Fan Gemein­de. „Plot” gab es bereits auf dem „NeXT”. Hier muss man aber momen­tan sel­ber noch „Hand anle­gen“ und z.B. via PHP pas­sen­de Schnitt­stel­len imple­men­tie­ren. Es ist geplant, die­se mit ein­zu­bau­en; die Arbei­ten hier­zu sind bei Redak­ti­ons­schluss bereits recht fort­ge­schrit­ten.

Letzt­lich steht es dem Benut­zer offen, wel­che Mög­lich­keit er wählt; Alter­na­ti­ven gibt es genug.

Für den rei­nen Anwen­der gibt es natür­lich auch eine viel ein­fa­che­re Lösung, näm­lich die bereits jetzt mit­ge­lie­fer­ten Dia­gram­me zu benut­zen.
Hier­zu wer­den zusätz­lich zu Python die fol­gen­den Kom­po­nen­ten benö­tigt:

  • Apa­che Web­ser­ver
  • PHP
  • MyS­QL Daten­bank

Zur Inter­ak­ti­on mit dem Raspi wer­den zusätz­lich emp­foh­len:

  • VNC (Ser­ver auf dem Raspi wird mit Raspi‐​Config akti­viert; auf dem eige­nen Rech­ner oder Smartphone/​Tablet braucht man dann noch den für pri­va­ten Gebrauch kos­ten­lo­sen VNC View­er)
  • Alter­na­tiv Win­dows Remo­te Desk­top
  • Sam­ba (um Ord­ner Windows‐​konform im Netz­werk zu tei­len)
  • Win­dows Benut­zer brau­chen „put­ty“ um eine SSH Ver­bin­dung auf­bau­en zu kön­nen (in Mac OS X oder Linux als „ssh“ bereits vor­han­den)
  • phpMy­Ad­min zur kom­for­ta­blen Brow­ser basier­ten Admi­nis­tra­ti­on der Daten­bank

Aus­führ­li­che und erprob­te Instal­la­ti­ons­an­lei­tun­gen (geeig­net zum Kopie­ren und Ein­fü­gen) fin­den sich auf dem Git­hub Repo­sito­ry des Pro­jek­tes, sie­he am Ende die­ses Arti­kels unter „Quel­len“.

Das Image

Wer sich das nicht zutraut oder den Auf­wand scheut, kann auch ein fer­ti­ges Image für den Raspber­ry Pi her­un­ter­la­den und auf eine SD Kar­te schrei­ben. Hier­zu wird ein han­dels­üb­li­cher USB SD Card Reader benö­tigt, der für weni­ge Euros zu haben ist. Vie­le Com­pu­ter haben so etwas auch bereits ein­ge­baut. Eine aus­führ­li­che Anlei­tung ist im her­un­ter­ge­la­de­nen ZIP Archiv als README Datei ent­hal­ten.

Solan­ge kei­ne spe­zi­el­len Anfor­de­run­gen vor­lie­gen und der Raspber­ry Pi über Ether­net an den Rou­ter ange­schlos­sen wird, funk­tio­niert die­se Lösung direkt „out‐​of‐​the‐​box”. Nach­dem das Image auf die SD Kar­te geschrie­ben wur­de kann die­ser also damit gestar­tet und die iSpin­del sofort (wie oben beschrie­ben) in Betrieb genom­men wer­den.

Soll der Zugriff über das Draht­los­netz­werk (WLAN) erfol­gen, müs­sen vor dem ers­ten Start die Zugangs­da­ten ein­ge­tra­gen wer­den!
Hier­zu öff­net man die Datei „wpa_supplicant.conf” auf dem PC mit­tels eines Text Edi­tors und trägt die­se Daten (Län­der­ken­nung, SSID und PSK Pass­phra­se) dort ein. So kann der Ser­ver direkt auch ohne ange­schlos­se­ne Tas­ta­tur oder Dis­play im soge­nann­ten „head­less” Modus in Betrieb genom­men wer­den.

Secu­re Shell (ssh) Zugriff auf die Kom­man­do­zei­le und Zugriff auf die gra­fi­sche Ober­flä­che PIXEL, via VNC oder Remo­te Desk­top sind hier bereits akti­viert, um wei­te­re Kon­fi­gu­ra­tio­nen vor­zu­neh­men, falls nötig oder erwünscht.

Im Unter­schied zur Ori­gi­nal Raspbi­an Instal­la­ti­on wur­den außer­dem die Pake­te für Libre­Of­fice und Wolf­ram Mathe­ma­ti­ca ent­fernt, um Platz und Band­brei­te zu spa­ren. Die­se kön­nen natür­lich bei Bedarf jeder­zeit über den Paket­ma­na­ger wie­der nach­in­stal­liert wer­den.

Sobald alles erle­digt und der Raspi erfolg­reich gestar­tet wor­den ist, sind alle wich­ti­gen Ver­zeich­nis­se und Datei­en (auch das Ser­ver Skript selbst) im Heim­netz als Sha­res ver­füg­bar; die iSpin­del kann nun ver­bun­den und die emp­fan­ge­nen Daten im Brow­ser ange­zeigt wer­den.

Die URL für den Brow­ser lau­tet hier­zu:

http://myraspi/iSpindle/diagramm.php?name=iSpindleName
  • myra­spi: Steht für die IP‐​Adresse oder den Namen des Raspber­ry im Heim­netz
  • dia­gramm: Eines der fol­gen­den:
  • angle.php: Tem­pe­ra­tur und Nei­gungs­win­kel (Tilt)
  • plato.php: Tem­pe­ra­tur und Rest­ex­trakt nach der in der iSpin­del Kon­fi­gu­ra­ti­on hin­ter­leg­ten Umrech­nungs­for­mel (Poly­nom)
  • plato4.php: Tem­pe­ra­tur und Rest­ex­trakt nach den in der Tabel­le „Cali­bra­ti­on“ hin­ter­leg­ten Kon­stan­ten (drei­stu­fi­ges Poly­nom); dies ermög­licht Kali­brie­rung im lau­fen­den bzw. erst­ma­li­gen Ein­satz der iSpin­del im Gär­be­häl­ter
  • status.php: Tem­pe­ra­tur, Win­kel, Bat­te­rie
  • battery.php: Nur Bat­te­rie­sta­tus
  • wifi.php: Aktu­el­le WLAN Ver­bin­dungs­qua­li­tät (ab Firm­ware 5.8.0)
  • reset_now.php: Kein Dia­gramm an sich; der Auf­ruf die­ses php Skripts trägt statt­des­sen eine Mar­kie­rung in die Daten­bank ein, die den Beginn einer neu­en Gärung defi­niert. So lässt sich sehr leicht die jeweils aktu­el­le Gär­kur­ve aus­wäh­len, sie­he nächs­ter Absatz…
  • iSpind­le­Na­me: Name der iSpin­del (wie in deren Kon­fi­gu­ra­ti­on ein­ge­tra­gen)

Die Dia­gramm­ty­pen „ang­le“, „pla­to“ und „plato4“ las­sen noch wei­te­re Para­me­ter zu, um den ange­zeig­ten Zeit­raum (immer rück­wir­kend ab jetzt) zu bestim­men:

  • hours={Anzahl der Stun­den}
  • days={Anzahl Tage}
  • weeks={Anzahl Wochen}
  • reset={0 oder 1}

Wenn reset=1 über­ge­ben wird, zeigt das Dia­gramm auto­ma­tisch die aktu­el­le kom­plet­te Gär­kur­ve an, falls via reset_now.php ein sol­cher Zeit­punkt gesetzt wur­de. Ansons­ten gel­ten die Zeit­an­ga­ben.

Die Dia­gram­me sind so for­ma­tiert, dass sie auch bequem auf das klei­ne, offi­zi­el­le 7 Zoll Touch Dis­play des Raspber­ry pas­sen und dort ver­nünf­tig dar­ge­stellt wer­den kön­nen.

Ein wei­te­res Bei­spiel, wie so ein Auf­ruf aus­se­hen kann:

http://192.168.2.44/iSpindle/angle.php?name=Maibock&weeks=2&days=5

Der Raspber­ry hat also die IP‐​Adresse 192.168.2.44 (die­se wird am bes­ten gleich in den Ein­stel­lun­gen des Rou­ters so fixiert, dass sie sich nicht mehr ändern kann; sie­he hier­zu die Bedie­nungs­an­lei­tung des Rou­ters); der Name der iSpin­del ist „Mai­bock“, und wir wol­len die Daten der letz­ten 2 Wochen und 5 Tage sehen (also 19 Tage).

Anstel­le der IP‐​Adresse kann aber auch der Netz­werk­na­me des Raspber­ry ste­hen, sofern die­ser nur in einem ein­zi­gen Heim­netz ein­ge­bucht ist (was beim Autor nicht der Fall ist). Die IP‐​Adresse ist immer der sichers­te Weg.

Auf einem Raspi mit 7“ (Touch) Dis­play schaut das dann so aus (Chro­me Brow­ser im Voll­bild­schirm Modus):

iSpindel-Diagramm auf einem 7-Zoll-Tablet

iSpindel-Diagramm auf einem 7-Zoll-Tablet

Die­ses Dia­gramm stammt „aus dem ech­ten Leben“. Über die dem Zeit­punkt der Auf­nah­me fol­gen­den 3 Tage hat sich die rote Kur­ve asym­pto­tisch geglät­tet und nach wei­te­ren 3 Tagen stand der Abfüll­zeit­punkt fest.

Ausblick

Künf­ti­ge Ver­sio­nen wer­den sich zunächst noch stär­ker mit der Benut­zer­freund­lich­keit befas­sen müs­sen. Neben einer Por­tals­ei­te, die kom­for­ta­bel die Aus­wahl von Dia­gram­men (auch per Touch­screen) ermög­li­chen soll, muss auch die Kon­fi­gu­ra­ti­on und die Kali­brie­rung der iSpin­del im lau­fen­den Betrieb über­ar­bei­tet wer­den. Ein Installations‐ und Update Skript ste­cken eben­falls noch in der Pipe­line.

Auch in Arbeit ist der­zeit eine Opti­on, die iSpin­del Kon­fi­gu­ra­ti­on im lau­fen­den Betrieb anpas­sen zu kön­nen, um bei­spiels­wei­se das Kalibrierungs‐​Polynom oder das Send­einter­vall der iSpin­del zu ändern, wäh­rend sie noch im Gär­be­häl­ter schwimmt.

Nach oben ist natür­lich auch wei­ter­hin jede Men­ge Luft, denn es han­delt sich um ein noch recht jun­ges Pro­jekt, wel­ches in (immer zu knap­per) Frei­zeit ent­wi­ckelt wur­de. Brau­en will man ja auch noch.

Von der Ale­xa Inte­gra­ti­on bis hin zu iOS Noti­fi­ca­ti­ons und auto­ma­ti­sier­ter Gär­steue­rung (Tem­pe­ra­tur­steue­rung anhand gemes­se­nen Rest­ex­trakts), Inte­gra­ti­on in Apple Home­Kit und so wei­ter und so fort; Vie­les ist mög­lich und letzt­lich alles kein Hexen­werk.
Nur Zeit braucht das halt alles.

Frei­wil­li­ge Hel­fer sind natür­lich immer will­kom­men! Vor­aus­set­zung sind nur ein paar grund­le­gen­de Kennt­nis­se in HTML und PHP, sowie ein grund­le­gen­des Ver­ständ­nis für SQL Daten­ban­ken.

Rechtliches (Lizenz)

Es gilt die GPL Stan­dard Lizenz für Open Source. Jeder darf mit die­ser Soft­ware anstel­len, was er möch­te.

Freu­en wür­de ich mich über jedes Feed­back; wer die Soft­ware ein­setzt, soll­te mir also eine kur­ze Nach­richt an stephan@sschreiber.de schi­cken, so viel Zeit soll­te drin sein. Das hilft auch, die Nach­fra­ge zu beur­tei­len, und beein­flusst mei­ne Moti­va­ti­on enorm.

Zuwen­dun­gen in Form von (selbst gebrau­tem) Bier wer­den auch ger­ne ange­nom­men. Ver­bes­se­run­gen und Erwei­te­run­gen müs­sen mir mit­ge­teilt wer­den, am bes­ten über Issu­es und/​oder Pull Requests auf Git­hub.

Jed­we­de kom­mer­zi­el­le Nut­zung ist unter­sagt, wenn nicht mit mir schrift­lich ver­ein­bart. Die Dia­gram­me basie­ren auf der GPL Ver­si­on von High­charts, wel­ches bei kom­mer­zi­el­ler Nut­zung eben­falls eine gül­ti­ge Lizenz vor­aus­setzt. Wei­ter­ver­brei­tung und Spie­ge­lung sind, mit Hin­weis auf die­se Lizenz­ver­ein­ba­rung und Link auf das Git­hub Repo­sito­ry, aus­drück­lich erwünscht.


Quel­len und Links:

Schreibe einen Kommentar