Ras­Py­Spin­del – Ein eige­ner Ser­ver 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 stehen.

Ein eige­ner 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 iSpindeln.

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 werden.

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 Fehlern.

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 auffallen.

Das aktu­el­le Modell der drit­ten Gene­ra­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ühlung.

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 Reichweite.

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 stellen.

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 Medienserver.

Soft­ware

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 Nebeneffekt).

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 werden.

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ährden.

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 werden.
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 „Cre­dits“ 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 werden).

Visua­li­sie­rung

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 anlegen.

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 Wesemann. 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 fortgeschritten.

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 benutzen.
Hier­zu wer­den zusätz­lich zu Python die fol­gen­den Kom­po­nen­ten benötigt:

  • Apa­che Webserver
  • PHP
  • MyS­QL Datenbank

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

  • 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 Viewer)
  • Alter­na­tiv Win­dows Remo­te Desktop
  • Sam­ba (um Ord­ner Windows-​konform im Netz­werk zu teilen)
  • 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 vorhanden)
  • phpMy­Ad­min zur kom­for­ta­blen Brow­ser basier­ten Admi­nis­tra­ti­on der Datenbank

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­si­to­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 Rea­der 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 enthalten.

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 werden.

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 werden!
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 werden.

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 werden.

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 Shares ver­füg­bar; die iSpin­del kann nun ver­bun­den und die emp­fan­ge­nen Daten im Brow­ser ange­zeigt werden.

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

http://myraspi/iSpindle/diagramm.php?name=iSpindleName
  • myra­spi: Steht für die IP-​Adresse oder den Namen des Raspber­ry im Heimnetz
  • dia­gramm: Eines der folgenden:
  • 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ärbehälter
  • status.php: Tem­pe­ra­tur, Win­kel, Batterie
  • battery.php: Nur Batteriestatus
  • 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 eingetragen)

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 bestimmen:

  • hours={Anzahl der Stunden}
  • 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 Zeitangaben.

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önnen.

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.

Aus­blick

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­tal­sei­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 Pipeline.

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 Sen­de­inter­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ärsteue­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 Hexenwerk.
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 Datenbanken.

Recht­li­ches (Lizenz)

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

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 Issues und/​oder Pull Requests auf Github.

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­si­to­ry, aus­drück­lich erwünscht.


Quel­len und Links:

Schreibe einen Kommentar